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