Django: Объедините две аннотации подсчета из двух запросов фильтрации
Я вычисляю некоторую статистику на основе двух различных фильтров, но я не уверен, как я могу объединить оба результата в один QuerySet.
Мой код выглядит следующим образом:
qs1 = User.objects.filter(c1).annotate(count1=Count("id"))
qs2 = User.objects.filter(c2).annotate(count2=Count("id"))
Я хочу создать третий набор запросов, qs3
, который содержит и count1
, и count2
. В основном я хочу выполнить левое объединение на User.id
, но не могу найти прямого способа сделать это.
Я также пробовал
count1 = Count('id', filter=c1)
count2 = Count('id', filter=c2)
qs3 = User.objects.annotate(count1=count1).annotate(count2=count2)
Но это дало мне другие результаты.
В итоге я решил проблему с помощью SubQuerys, как описано в первом ответе здесь.
qs1 = User.objects.filter(c1).annotate(count=Count('id')).filter(pk=OuterRef('pk'))
qs2 = User.objects.filter(c2).annotate(count=Count('id')).filter(pk=OuterRef('pk'))
users = User.objects.annotate(
count1=Subquery(qs1.values('count'), output_field=IntegerField()),
count2=Subquery(qs2.values('count'), output_field=IntegerField())
)
Я все еще не до конца понимаю решение, поскольку впервые вижу SubQuery, но, похоже, оно работает. Если кто-то хочет дать более подробный ответ, я с радостью приму его.