forked from CGM_Public/pretix_original
Hand-optimize some queries
This commit is contained in:
20
src/pretix/base/migrations/0080_auto_20171016_1553.py
Normal file
20
src/pretix/base/migrations/0080_auto_20171016_1553.py
Normal file
@@ -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)'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -839,7 +839,7 @@ class Quota(LoggedModel):
|
|||||||
& Q(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gte=now_dt))
|
& Q(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gte=now_dt))
|
||||||
) &
|
) &
|
||||||
self._position_lookup
|
self._position_lookup
|
||||||
).values('id').distinct().count()
|
).count()
|
||||||
|
|
||||||
def count_pending_orders(self) -> dict:
|
def count_pending_orders(self) -> dict:
|
||||||
from pretix.base.models import Order, OrderPosition
|
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.
|
# This query has beeen benchmarked against a Count('id', distinct=True) aggregate and won by a small margin.
|
||||||
return OrderPosition.objects.filter(
|
return OrderPosition.objects.filter(
|
||||||
self._position_lookup, order__status=Order.STATUS_PENDING, order__event=self.event, subevent=self.subevent
|
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):
|
def count_paid_orders(self):
|
||||||
from pretix.base.models import Order, OrderPosition
|
from pretix.base.models import Order, OrderPosition
|
||||||
|
|
||||||
return OrderPosition.objects.filter(
|
return OrderPosition.objects.filter(
|
||||||
self._position_lookup, order__status=Order.STATUS_PAID, order__event=self.event, subevent=self.subevent
|
self._position_lookup, order__status=Order.STATUS_PAID, order__event=self.event, subevent=self.subevent
|
||||||
).values('id').distinct().count()
|
).count()
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def _position_lookup(self) -> Q:
|
def _position_lookup(self) -> Q:
|
||||||
return (
|
return (
|
||||||
( # Orders for items which do not have any variations
|
( # Orders for items which do not have any variations
|
||||||
Q(variation__isnull=True) &
|
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
|
) | ( # 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))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -828,7 +828,7 @@ class CartPosition(AbstractPosition):
|
|||||||
verbose_name=_("Event")
|
verbose_name=_("Event")
|
||||||
)
|
)
|
||||||
cart_id = models.CharField(
|
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)")
|
verbose_name=_("Cart ID (e.g. session key)")
|
||||||
)
|
)
|
||||||
datetime = models.DateTimeField(
|
datetime = models.DateTimeField(
|
||||||
|
|||||||
Reference in New Issue
Block a user