| 230 | ) |
| 231 | |
| 232 | def _update_metadata( |
| 233 | self, |
| 234 | instance: Model, |
| 235 | metadata_data: list[dict[str, Any]], |
| 236 | ) -> None: |
| 237 | content_type = ContentType.objects.get_for_model(type(instance)) |
| 238 | existing_metadata = Metadata.objects.filter( |
| 239 | object_id=instance.pk, |
| 240 | content_type=content_type, |
| 241 | ) |
| 242 | |
| 243 | new_metadata = [ |
| 244 | Metadata( |
| 245 | model_field=model_field, |
| 246 | content_type=content_type, |
| 247 | object_id=instance.pk, |
| 248 | field_value=metadata_item["field_value"], |
| 249 | ) |
| 250 | for metadata_item in metadata_data |
| 251 | if (model_field := metadata_item["model_field"]) and model_field.pk |
| 252 | ] |
| 253 | |
| 254 | with transaction.atomic(): |
| 255 | existing_metadata.delete() |
| 256 | Metadata.objects.bulk_create(new_metadata) |