Further SQL optimizations

This commit is contained in:
Raphael Michel
2016-11-08 16:58:48 +01:00
parent 4c80ec17bf
commit 37598ed914
8 changed files with 65 additions and 23 deletions

View File

@@ -582,7 +582,7 @@ class Quota(LoggedModel):
Q(redeemed=False) &
Q(Q(valid_until__isnull=True) | Q(valid_until__gte=now_dt)) &
Q(Q(self._position_lookup) | Q(quota=self))
).distinct().count()
).values('id').distinct().count()
def count_in_cart(self, now_dt: datetime=None) -> int:
from pretix.base.models import CartPosition
@@ -595,21 +595,22 @@ class Quota(LoggedModel):
& Q(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gte=now_dt))
) &
self._position_lookup
).distinct().count()
).values('id').distinct().count()
def count_pending_orders(self) -> dict:
from pretix.base.models import Order, OrderPosition
# 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,
).distinct().count()
).values('id').distinct().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
).distinct().count()
).values('id').distinct().count()
@cached_property
def _position_lookup(self) -> Q:

View File

@@ -515,7 +515,8 @@ class CartPosition(AbstractPosition):
auto_now_add=True
)
expires = models.DateTimeField(
verbose_name=_("Expiration date")
verbose_name=_("Expiration date"),
db_index=True
)
class Meta:

View File

@@ -70,10 +70,11 @@ class Voucher(LoggedModel):
)
redeemed = models.BooleanField(
verbose_name=_("Redeemed"),
default=False
default=False,
db_index=True
)
valid_until = models.DateTimeField(
blank=True, null=True,
blank=True, null=True, db_index=True,
verbose_name=_("Valid until")
)
block_quota = models.BooleanField(