2011-12-12 21 views
2

型号: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}] 

这是很好的,所有与但什么我真正想要的是能够获得有关该项目的额外信息,例如其名称等。但我似乎无法轻松做到这一点,因为我所得到的仅仅是t他的商品ID,因此我无法在我的模板中执行操作,例如{{item.name}}。

有没有这样做的一些好方法?

回答

4

这样做。尝试:

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

这是相当性感,它甚至工作。谢谢。 –

+0

真是太美了。一段我希望我一年前找到的代码 – Nirri

2

正如你所关心的从项目获得额外的数据,而不是出售,你可以在该类查询:

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'))