Django 如何基于另一个查询集计算相关多对多对象的计数?

Django 如何基于另一个查询集计算相关多对多对象的计数?,django,django-orm,Django,Django Orm,尽管在注释中带有count()的queryset内有F,但它仍会抛出一个错误TypeError:queryset.annotate()接收到非表达式:0。表示该queryset已在适当位置执行 也不起作用,但这次它只返回无效值(始终为1,始终计数区域单个对象,而不是过滤器中的对象): Django急切地对.count()进行评估,因此Django将尝试评估航班.filter(zones_uupk=F('pk')).distinct().count(),并成功地进行评估,因为F('pk'))将统计

尽管在注释中带有
count()
的queryset内有
F
,但它仍会抛出一个错误
TypeError:queryset.annotate()接收到非表达式:0。
表示该queryset已在适当位置执行

也不起作用,但这次它只返回无效值(始终为1,始终计数区域单个对象,而不是过滤器中的对象):

Django急切地对
.count()
进行评估,因此Django将尝试评估
航班.filter(zones_uupk=F('pk')).distinct().count()
,并成功地进行评估,因为
F('pk'))
将统计
航班的
数量,其中有
区域
,恰好与
航班的主键相同。您需要在子查询上使用和
.annotate(..)

但你把事情弄得太复杂了。您只需使用以下内容进行注释:

qs1 = Zone.objects.annotate(
   count=Count('pk', filter=flights.filter(zones__pk=F('pk'))),  # with 'flight' instead of first 'pk' it also doesn't work
)

计数将立即计算,因此不能使用该值。
qs1 = Zone.objects.annotate(
   count=Count('pk', filter=flights.filter(zones__pk=F('pk'))),  # with 'flight' instead of first 'pk' it also doesn't work
)
from django.db.models import Q, Sum

Zone.objects.annotate(
    count=Count('flight', distinct=True, filter=Q(flight__…))
)
Zone.objects.annotate(
    count=Count('flight', distinct=True, filter=Q(flight__active=True))
)