Django聚合及其外键关系追踪

4 投票
2 回答
5805 浏览
提问于 2025-04-17 08:12

模型:

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 个回答

4

因为你想从商品中获取额外的数据,而不是从销售中获取,所以你可以直接查询商品这个类:

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

这样会返回ORM对象,而不是简单的或者值列表。你还会得到一个合成的id__count属性,这个属性会显示特定商品的销售数量。

另外,如果你提前知道自己想要哪些字段,也可以在values调用中明确列出这些字段,比如:

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

这样就可以了。试试这个:

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

撰写回答