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 个回答
5
我得自己回答自己的问题 :) 如果你想查询A这个对象,像这样:
A.objects.select_related().filter(atrr=val).annotate(n_b=models.Count('B'))
这样会生成一个很长的查询,但至少只有一个查询。
6
从Django 2.0开始,Count()
这个聚合函数可以接受一个叫做filter
的参数。这个参数可以让你对相关对象的查询结果加上一些额外的限制。简单来说,就是你可以更精确地控制你想要统计的数据。具体的用法是这样的:
A.objects.select_related().annotate(
total=models.Count('myrelated__pk', filter=Q(only_items='that-i-need'))
).all()
21
我没有尝试过到底执行了多少个查询,但在Django中,应该使用annotate()
这个方法。比如说:
from django.db.models import Count
q = A.objects.select_related('B').annotate(num_B=Count('B'))
print A[0].num_B