сложный агрегат в Джанго
У меня есть следующие модели:
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 ответ:
Что ж, давайте попробуем (все еще нужно протестировать оптимизированный 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]