Как агрегировать сумму нескольких предыдущих агрегированных значений в 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'))