From c7c9845806a7e826e5e12f7b7785b8b86866a72f Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 12 Feb 2026 11:10:41 -0800 Subject: [PATCH] pre-fetch versions --- src/documents/serialisers.py | 24 ++++++++++++++++++------ src/documents/views.py | 17 ++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index a2bc77bf4..4b5e8d1b3 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1145,13 +1145,25 @@ class DocumentSerializer( root_doc = obj if obj.root_document_id is None else obj.root_document if root_doc is None: return [] - versions_qs = Document.objects.filter(root_document=root_doc).only( - "id", - "added", - "checksum", - "version_label", + + prefetched_cache = getattr(obj, "_prefetched_objects_cache", None) + prefetched_versions = ( + prefetched_cache.get("versions") + if isinstance(prefetched_cache, dict) + else None ) - versions = [*versions_qs, root_doc] + + versions: list[Document] + if prefetched_versions is not None: + versions = [*prefetched_versions, root_doc] + else: + versions_qs = Document.objects.filter(root_document=root_doc).only( + "id", + "added", + "checksum", + "version_label", + ) + versions = [*versions_qs, root_doc] def build_info(doc: Document) -> _DocumentVersionInfo: return { diff --git a/src/documents/views.py b/src/documents/views.py index cd24a78d1..90bd4a6a4 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -35,6 +35,7 @@ from django.db.models import IntegerField from django.db.models import Max from django.db.models import Model from django.db.models import OuterRef +from django.db.models import Prefetch from django.db.models import Q from django.db.models import Subquery from django.db.models import Sum @@ -797,7 +798,21 @@ class DocumentViewSet( .annotate(effective_content=Coalesce(latest_version_content, F("content"))) .annotate(num_notes=Count("notes")) .select_related("correspondent", "storage_path", "document_type", "owner") - .prefetch_related("tags", "custom_fields", "notes") + .prefetch_related( + Prefetch( + "versions", + queryset=Document.objects.only( + "id", + "added", + "checksum", + "version_label", + "root_document_id", + ), + ), + "tags", + "custom_fields", + "notes", + ) ) def get_serializer(self, *args, **kwargs):