Как агрегировать сумму нескольких предыдущих агрегированных значений в django ORM

Используется: django 3.2.10, postgresql 13.4
. У меня есть следующий набор запросов с агрегатной функцией Count

queryset = Model.objects.all().aggregate(
    trues=Count('id', filter=Q(criteria=True)),
    falses=Count('id', filter=Q(criteria=False)),
)

Что я хочу:

queryset = Model.objects.all().aggregate(
    trues=Count('id', filter=Q(criteria=True)),
    falses=Count('id', filter=Q(criteria=False)),
    total=trues+falses, <--------------THIS
)

Как это сделать?

После агрегации мало что можно сделать, так как она возвращает объект python dict.

Я понимаю, что ваш пример здесь не является вашей реальной ситуацией, поскольку вы можете просто сделать

Model.objects.aggregate(
    total = (Count('id', filter=Q(criteria=True))
        + Count('id', filter=Q(criteria=False)))
)

Я хочу сказать, что Django предоставляет .values().annotate() для достижения GROUP BY клаузулы, как в языке sql.

Приведите свой пример здесь

queryset = Model.objects.values('criteria').annotate(count=Count('id'))

queryset здесь по-прежнему является объектом 'QuerySet', и вы можете далее модифицировать queryset как

queryset = queryset.aggregate(
    total=Sum('count')
)

Надеюсь, это поможет.

похоже, вам нужно общее количество ложных и истинных критериев, поэтому вы можете просто сделать следующее

queryset = Model.objects.all().filter(
           Q(criteria=True) | Q(criteria=False)).count()

или вы можете использовать (не рекомендуется, если только вы не хотите показать что-то в середине)

from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When

query = Model.objects.annotate(trues=Count('id',filter=Q(criteria=True)), 
falses=Count('id',filter=Q(criteria=False))).annotate(trues_false=F('trues')+F('falses')).aggregate(total=Sum('trues_false'))
Вернуться на верх