Django 计算相关对象数量

13 投票
3 回答
17787 浏览
提问于 2025-04-16 03:18

我想知道在Django中,如何在少于N次查询的情况下计算相关对象的数量,其中N是对象的数量。

为了更清楚地说明,假设我有两个表AB。每个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

撰写回答