如何计算Django中的相关对象(少于 N 查询,其中 N 是对象的数量)。
为了澄清,假设我有表 A 和 B 。每个 B 只与一个 A 连接。我试过的方法:
A.objects.select_related().filter(attr=val)
A[i].B_set.count()
当然,对于每个 A [i] ,我想找出 B 对象的数量,Django会执行一个查询。
所以问题是 - 有没有办法优化它?
答案 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()