From edbedcd0fac6e7e10fcc5da39af3061bedb7c125 Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Sun, 28 Aug 2022 12:56:26 +0100 Subject: [PATCH] Remove unnecessary extra query during search Just pass the original queryset, which helps ordering and performance --- website/search/models.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/website/search/models.py b/website/search/models.py index 8d991b0..9d4f1ea 100644 --- a/website/search/models.py +++ b/website/search/models.py @@ -7,7 +7,6 @@ from django.utils.functional import cached_property from django.views.decorators.http import require_GET from wagtail.contrib.routable_page.models import RoutablePageMixin, route from wagtail.models import Page -from wagtail.query import PageQuerySet from wagtail.search.utils import parse_query_string from website.common.models import BaseContentPage @@ -63,7 +62,11 @@ class SearchPage(RoutablePageMixin, BaseContentPage): } filters, query = parse_query_string(search_query) - pages = Page.objects.live().not_type(self.__class__, HomePage).search(query) + pages = ( + Page.objects.live() + .not_type(self.__class__, HomePage) + .search(query, order_by_relevance=True) + ) paginator = Paginator(pages, self.PAGE_SIZE) context["paginator"] = paginator @@ -72,12 +75,11 @@ class SearchPage(RoutablePageMixin, BaseContentPage): results = paginator.page(page_num) # HACK: Search results aren't a queryset, so we can't call `.specific` on it. This forces it to one as efficiently as possible - if not isinstance(results.object_list, PageQuerySet): - results.object_list = Page.objects.filter( - id__in=list( - results.object_list.get_queryset().values_list("id", flat=True) - ) - ).specific() + results.object_list = ( + results.object_list.get_queryset() + .specific() + .select_related("hero_image", "hero_unsplash_photo") + ) except EmptyPage: results = []