From a2c5ce5ebcdb150dde92fb8e9085f129d29be6aa Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 16 Oct 2017 18:03:20 +0200 Subject: [PATCH] Hand-optimize some queries --- .../migrations/0080_auto_20171016_1553.py | 20 +++++++++++++++++++ src/pretix/base/models/items.py | 10 +++++----- src/pretix/base/models/orders.py | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 src/pretix/base/migrations/0080_auto_20171016_1553.py diff --git a/src/pretix/base/migrations/0080_auto_20171016_1553.py b/src/pretix/base/migrations/0080_auto_20171016_1553.py new file mode 100644 index 0000000000..04352f9c6c --- /dev/null +++ b/src/pretix/base/migrations/0080_auto_20171016_1553.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-10-16 15:53 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0079_auto_20171010_2117'), + ] + + operations = [ + migrations.AlterField( + model_name='cartposition', + name='cart_id', + field=models.CharField(blank=True, db_index=True, max_length=255, null=True, verbose_name='Cart ID (e.g. session key)'), + ), + ] diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 4b1e16cbc4..b00f827891 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -839,7 +839,7 @@ class Quota(LoggedModel): & Q(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gte=now_dt)) ) & self._position_lookup - ).values('id').distinct().count() + ).count() def count_pending_orders(self) -> dict: from pretix.base.models import Order, OrderPosition @@ -847,23 +847,23 @@ class Quota(LoggedModel): # This query has beeen benchmarked against a Count('id', distinct=True) aggregate and won by a small margin. return OrderPosition.objects.filter( self._position_lookup, order__status=Order.STATUS_PENDING, order__event=self.event, subevent=self.subevent - ).values('id').distinct().count() + ).count() def count_paid_orders(self): from pretix.base.models import Order, OrderPosition return OrderPosition.objects.filter( self._position_lookup, order__status=Order.STATUS_PAID, order__event=self.event, subevent=self.subevent - ).values('id').distinct().count() + ).count() @cached_property def _position_lookup(self) -> Q: return ( ( # Orders for items which do not have any variations Q(variation__isnull=True) & - Q(item__quotas=self) + Q(item_id__in=Quota.items.through.objects.filter(quota_id=self.pk).values_list('item_id', flat=True)) ) | ( # Orders for items which do have any variations - Q(variation__quotas=self) + Q(variation__in=Quota.variations.through.objects.filter(quota_id=self.pk).values_list('id', flat=True)) ) ) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index c0f6b2e88e..e55383439e 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -828,7 +828,7 @@ class CartPosition(AbstractPosition): verbose_name=_("Event") ) cart_id = models.CharField( - max_length=255, null=True, blank=True, + max_length=255, null=True, blank=True, db_index=True, verbose_name=_("Cart ID (e.g. session key)") ) datetime = models.DateTimeField(