Django中的复杂聚合

时间:2013-09-16 21:09:45

标签: django django-queryset

我有以下型号:

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 个答案:

答案 0 :(得分: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]