Query optimization experiments

This commit is contained in:
Raphael Michel
2018-01-14 21:15:42 +01:00
parent 7f90fdedf1
commit 59d85cc218
2 changed files with 9 additions and 8 deletions

View File

@@ -1,6 +1,6 @@
from django import forms from django import forms
from django.apps import apps 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.db.models.functions import Coalesce, Concat
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import pgettext_lazy, ugettext_lazy as _ from django.utils.translation import pgettext_lazy, ugettext_lazy as _
@@ -115,17 +115,14 @@ class OrderFilterForm(FilterForm):
else: else:
code = Q(code__icontains=Order.normalize_code(u)) code = Q(code__icontains=Order.normalize_code(u))
matching_invoice = Invoice.objects.filter( matching_invoices = Invoice.objects.annotate(
order=OuterRef('pk'),
).annotate(
inr=Concat('prefix', 'invoice_no') inr=Concat('prefix', 'invoice_no')
).filter( ).filter(
Q(invoice_no__iexact=u) Q(invoice_no__iexact=u)
| Q(invoice_no__iexact=u.zfill(5)) | Q(invoice_no__iexact=u.zfill(5))
| Q(inr=u) | Q(inr=u)
) ).values_list('order_id', flat=True)
qs = qs.annotate(has_inv=Exists(matching_invoice))
qs = qs.filter( qs = qs.filter(
code code
| Q(email__icontains=u) | Q(email__icontains=u)
@@ -133,7 +130,7 @@ class OrderFilterForm(FilterForm):
| Q(positions__attendee_email__icontains=u) | Q(positions__attendee_email__icontains=u)
| Q(invoice_address__name__icontains=u) | Q(invoice_address__name__icontains=u)
| Q(invoice_address__company__icontains=u) | Q(invoice_address__company__icontains=u)
| Q(has_inv=True) | Q(pk__in=matching_invoices)
) )
if fdata.get('status'): if fdata.get('status'):

View File

@@ -34,4 +34,8 @@ class OrderSearch(PaginationMixin, ListView):
if self.filter_form.is_valid(): if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs) 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'
)