From 37961e437b803faf8fd64d431b786d99f25515c8 Mon Sep 17 00:00:00 2001 From: imperosol Date: Thu, 4 Sep 2025 17:39:17 +0200 Subject: [PATCH] fix: N+1 queries on PageListView --- core/templates/core/page_list.jinja | 16 ++++++---------- core/views/page.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/core/templates/core/page_list.jinja b/core/templates/core/page_list.jinja index dfb8ea48..7a64035b 100644 --- a/core/templates/core/page_list.jinja +++ b/core/templates/core/page_list.jinja @@ -5,16 +5,12 @@ {% endblock %} {% block content %} - {% if page_list %} -

{% trans %}Page list{% endtrans %}

- - {% else %} - {% trans %}There is no page in this website.{% endtrans %} - {% endif %} +

{% trans %}Page list{% endtrans %}

+ {% endblock %} diff --git a/core/views/page.py b/core/views/page.py index 23898217..db366891 100644 --- a/core/views/page.py +++ b/core/views/page.py @@ -12,7 +12,10 @@ # OR WITHIN THE LOCAL FILE "LICENSE" # # + from django.contrib.auth.mixins import PermissionRequiredMixin +from django.db.models import F, OuterRef, Subquery +from django.db.models.functions import Coalesce # This file contains all the views that concern the page model from django.forms.models import modelform_factory @@ -43,6 +46,20 @@ class CanEditPagePropMixin(CanEditPropMixin): class PageListView(CanViewMixin, ListView): model = Page template_name = "core/page_list.jinja" + queryset = ( + Page.objects.annotate( + display_name=Coalesce( + Subquery( + PageRev.objects.filter(page=OuterRef("id")) + .order_by("-date") + .values("title")[:1] + ), + F("name"), + ) + ) + .prefetch_related("view_groups") + .select_related("parent") + ) class PageView(CanViewMixin, DetailView):