在django查询中混合注释和aggreagate

时间:2016-01-22 06:58:14

标签: mysql django django-models django-orm

我有两个名为ImageProduct的表。

class Image():
     product = Foreignkey(Product, related_name='image')
     #some more field e.g. image_name, slug, caption, etc.

产品可以有ZERO,一张或最多5张图片。 我想计算有X号的产品数量。图像。

我尝试了天真的方法,但它做了N(#products)+1 SQL查询。

d = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
for x in product.objects.all():
    d[x.image.count()] += 1

我认为我们可以使用select_related来完成,但不知道该怎么做。 我尝试使用注释但不工作。 Image.objects.annotate(x=Count('product')) 我在django的经历不是很多。我想知道如果我可以通过单个查询或更优化的方式来实现它。

1 个答案:

答案 0 :(得分:0)

这是一个拥有sql查询的组。在django orm中,您可以搜索"过滤注释"来自django doc。

Product.objects.annotate(num_images=Count('image')).filter(num_images=5)