diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index 83c07742c..9fcfbdbc2 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -1,6 +1,6 @@ from django import forms from django.apps import apps -from django.db.models import Exists, F, OuterRef, Q +from django.db.models import F, Q from django.db.models.functions import Coalesce, Concat from django.utils.timezone import now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ @@ -115,17 +115,14 @@ class OrderFilterForm(FilterForm): else: code = Q(code__icontains=Order.normalize_code(u)) - matching_invoice = Invoice.objects.filter( - order=OuterRef('pk'), - ).annotate( + matching_invoices = Invoice.objects.annotate( inr=Concat('prefix', 'invoice_no') ).filter( Q(invoice_no__iexact=u) | Q(invoice_no__iexact=u.zfill(5)) | Q(inr=u) - ) + ).values_list('order_id', flat=True) - qs = qs.annotate(has_inv=Exists(matching_invoice)) qs = qs.filter( code | Q(email__icontains=u) @@ -133,7 +130,7 @@ class OrderFilterForm(FilterForm): | Q(positions__attendee_email__icontains=u) | Q(invoice_address__name__icontains=u) | Q(invoice_address__company__icontains=u) - | Q(has_inv=True) + | Q(pk__in=matching_invoices) ) if fdata.get('status'): diff --git a/src/pretix/control/views/search.py b/src/pretix/control/views/search.py index 417aec145..1792378da 100644 --- a/src/pretix/control/views/search.py +++ b/src/pretix/control/views/search.py @@ -34,4 +34,8 @@ class OrderSearch(PaginationMixin, ListView): if self.filter_form.is_valid(): qs = self.filter_form.filter_qs(qs) - return qs.distinct().prefetch_related('event', 'event__organizer') + return qs.distinct().only( + 'id', 'invoice_address__name', 'code', 'event', 'email', 'datetime', 'total', 'status' + ).prefetch_related( + 'event', 'event__organizer' + )