More efficient reflect_docklinks

This commit is contained in:
shamoon 2023-12-11 19:10:58 -08:00
parent b07deeda07
commit 8abdf2cfee

View File

@ -517,20 +517,36 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
if doc_id not in target_doc_ids: if doc_id not in target_doc_ids:
self.remove_doclink(document, field, doc_id) self.remove_doclink(document, field, doc_id)
# Create an instance if target doc doesnt have this field or append it to an existing one
existing_custom_field_instances = {
custom_field.document_id: custom_field
for custom_field in CustomFieldInstance.objects.filter(
field=field,
document_id__in=target_doc_ids,
)
}
custom_field_instances_to_create = []
custom_field_instances_to_update = []
for target_doc_id in target_doc_ids: for target_doc_id in target_doc_ids:
target_doc_field_instance = CustomFieldInstance.objects.filter( target_doc_field_instance = existing_custom_field_instances.get(
field=field, target_doc_id,
)
if target_doc_field_instance is None:
custom_field_instances_to_create.append(
CustomFieldInstance(
document_id=target_doc_id, document_id=target_doc_id,
).first() field=field,
if target_doc_field_instance is not None: value_document_ids=[document.id],
if document.id not in target_doc_field_instance.value: ),
)
elif document.id not in target_doc_field_instance.value:
target_doc_field_instance.value_document_ids.append(document.id) target_doc_field_instance.value_document_ids.append(document.id)
target_doc_field_instance.save() custom_field_instances_to_update.append(target_doc_field_instance)
else:
CustomFieldInstance.objects.update_or_create( CustomFieldInstance.objects.bulk_create(custom_field_instances_to_create)
document_id=target_doc_id, CustomFieldInstance.objects.bulk_update(
field=field, custom_field_instances_to_update,
defaults={"value_document_ids": [document.id]}, ["value_document_ids"],
) )
def remove_doclink( def remove_doclink(