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, но, похоже, оно работает. Если кто-то хочет дать более подробный ответ, я с радостью приму его.

Вернуться на верх