Django聚合和跟随外键关系

时间:2011-12-12 11:33:44

标签: python django

型号:

class Item(models.Model):
    name = models.CharField(max_length=100)
    # More stuff.
class Sale(models.Model):
    sale_date = models.DateField(auto_now_add=True)
    item = models.ForeignKey(Item)
    # More stuff.

查看:

class TodaySales(ListView):
    # Stuff in here.
    def get_queryset(self):
        sales_today = Sale.objects.filter(sale_date=date.today())
        return sales_today.values('item').annotate(Count('item'))

我得到这样的东西:

[{'item': 1, 'item__count': 2}, {'item': 2, 'item__count': 1}]

这很好,但是我真正想要的是能够获得有关该项目的额外信息,例如其名称等。但我似乎无法轻易做到这一点,因为我得到的只是项目ID,所以我不能在我的模板中执行,例如,{{item.name}}。

有没有好办法呢?

2 个答案:

答案 0 :(得分:6)

这样做。尝试:

Item.objects.filter(
    sale__sale_date=date.today()
).annotate(
    count = Count('sale')
)

答案 1 :(得分:3)

当您关心从Item而不是Sale中获取额外数据时,您可以查询该类:

models.Item.objects.filter(sale__sale_date=date.today()).annotate(Count('id'))

返回ORM对象,而不是valuesvalues_list:您还可以使用合成id__count属性来处理该特定项目的销售计数。

或者,如果您提前知道所需的字段,也可以在values调用中明确命名,例如:

sales_today.values('item', 'item__name').annotate(Count('item'))