通过值查询集注释查询集

时间:2018-02-02 00:17:25

标签: python django django-models django-rest-framework

我想为查询集注释一个对象计数,我知道该怎么做,但我希望计算的对象有自己的过滤。

效果很好;

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

这可能吗?

1 个答案:

答案 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)
) 
相关问题