我想为查询集注释一个对象计数,我知道该怎么做,但我希望计算的对象有自己的过滤。
效果很好;
first_model_qs = FirstModel.objects.filter(do a bunch of filtering)
grouped_values_qs = first_model_qs.values('second_model').annotate(Count('pk'))
所以我现在有一个很好的查询集,所有first_model
计数按second_model
ID分组。真棒。
我现在想做的事情是这样的;
secound_model_qs = SecondModel.objects.annotate(first_model_count = grouped_values_qs)
然后可以说secound_model_qs.first().first_model_count
这可能吗?
答案 0 :(得分:2)
我认为你可以使用Subquery,更具体地说Using aggregates within a Subquery expression
from django.db.models import OuterRef, Subquery, Count
first_model_query = (FirstModel.objects
# Do the filtering
.filter(second_model=OuterRef('pk'))
# add grouping
.values('second_model')
# do the aggregation
.annotate(cnt=Count('pk'))
# now return only a single column
.values('cnt')
)
secound_model_qs = SecondModel.objects.annotate(
first_model_count=Subquery(first_model_query)
)