From 8c1225e120ca582c443ed9f68b0d5a0d6d8ae49f Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:10:28 -0700 Subject: [PATCH] Fixes an N+1 query in matching with the version content fetching by prefetching versions (#12562) --- src/documents/consumer.py | 4 ++++ src/documents/models.py | 5 ++++- src/documents/views.py | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 8035f3857..6656a3d96 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -650,6 +650,10 @@ class ConsumerPlugin( # If we get here, it was successful. Proceed with post-consume # hooks. If they fail, nothing will get changed. + document = Document.objects.prefetch_related("versions").get( + pk=document.pk, + ) + document_consumption_finished.send( sender=self.__class__, document=document, diff --git a/src/documents/models.py b/src/documents/models.py index 9af5fbc23..e2f5bb3dc 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -381,7 +381,10 @@ class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager- if isinstance(prefetched_cache, dict) else None ) - if prefetched_versions: + if prefetched_versions is not None: + # Empty list means prefetch ran and found no versions — use own content. + if not prefetched_versions: + return self.content latest_prefetched = max(prefetched_versions, key=lambda doc: doc.id) return latest_prefetched.content diff --git a/src/documents/views.py b/src/documents/views.py index dd9c4b837..8d86aa776 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1248,7 +1248,10 @@ class DocumentViewSet( ), ) def suggestions(self, request, pk=None): - doc = get_object_or_404(Document.objects.select_related("owner"), pk=pk) + doc = get_object_or_404( + Document.objects.select_related("owner").prefetch_related("versions"), + pk=pk, + ) if request.user is not None and not has_perms_owner_aware( request.user, "view_document",