Django计算相关对象

时间:2010-08-25 20:32:33

标签: python django

如何计算Django中的相关对象(少于 N 查询,其中 N 是对象的数量)。

为了澄清,假设我有表 A B 。每个 B 只与一个 A 连接。我试过的方法:

A.objects.select_related().filter(attr=val)
A[i].B_set.count()

当然,对于每个 A [i] ,我想找出 B 对象的数量,Django会执行一个查询。

所以问题是 - 有没有办法优化它?

3 个答案:

答案 0 :(得分:11)

我还没有尝试过执行了多少查询,但Django方式应该使用annotate()。例如:

from django.db.models import Count

q = A.objects.select_related('B').annotate(num_B=Count('B'))
print A[0].num_B

答案 1 :(得分:4)

我必须回答我自己的问题:)如果A的对象被查询如下:

A.objects.select_related().filter(atrr=val).annotate(n_b=models.Count('B'))

这会创建非常长的查询,但至少只有一个。

答案 2 :(得分:0)

由于Django 2.0 Count()聚合函数accepts filter parameter,因此允许对相关对象查询集应用其他限制。 像这样工作:

A.objects.select_related().annotate(
    total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need'))
).all()