сложный агрегат в Джанго


У меня есть следующие модели:

class Item(models.model):
    price = models.floatField()
    ...

И:

class purchase(models.model):
    user = models.ForeignKey(User)
    item = models.ForeignKey(Item)
    date = models.DateField()

Я хотел бы сделать запрос, который предоставит топ-10 пользователей, которые приобрели больше всего за последнюю неделю .Я также хотел бы получить сумму купленного ими за эту неделю.

Таким образом, вывод, который я хотел бы показать на своей странице, похож на это:

Лучшие покупатели недели:

1. User_1   |  150 Points
2. User_2   |  130 Points
...
10. User_10 |  10 Points

Можно ли для этого использовать аннотацию ? или он должен быть разбит на несколько запросов ?

1 2

1 ответ:

Что ж, давайте попробуем (все еще нужно протестировать оптимизированный SQL):

from datetime import timedelta
from django.db.models import Sum
from django.contrib.auth.models import User
from django.utils import timezone


some_day_last_week = timezone.now().date() - timedelta(days=7)

rows = User.objects.filter(purchases__date__gte=some_day_last_week)\
                   .annotate(item_sum=Sum('purchases__item__price'))\
                   .order_by('item_sum')[:10]

print [(u.username, u.item_sum) for u in rows]