Как я могу аннотировать другую группу аннотаций по запросу в django
У меня два квеста
Proyecto.objects.filter().order_by('tipo_proyecto')
Proyecto.objects.values('tipo_proyecto').annotate(total=Sum('techo_presupuestario'))
Как я могу сделать это в одном запросе, я хочу, чтобы первый запрос содержал аннотированные данные, которые представляют всю сумму techo_presupuestario в зависимости от вашего tipo_proyecto возможно ли это?
Если я правильно вас понял, вы хотите добавить условно агрегированную сумму по одному полю к каждому объекту, чтобы получить каждый объект с суммой, соответствующей его tipo_proyecto. Правильно? Я не знаю, имеет ли это смысл, но это можно сделать в любом случае, используя Subquery:
from django.db.models import Sum, Subquery, OuterRef
sq = Subquery(Proyecto.objects.filter(tipo_proyecto=OuterRef("tipo_proyecto")).values("tipo_proyecto").annotate(techoSum=Sum("techo_presupuestario")).values("techoSum"))
Proyecto.objects.all().annotate(tipoTechoSum = sq).order_by('tipo_proyecto')
Тем не менее, я бы не рекомендовал этого делать, так как это создает большую нагрузку на вашу базу данных. (В MySQL будет вложенный оператор SELECT, ссылающийся на ту же самую таблицу, что может быть довольно неприятно в зависимости от размера таблицы.)
Я бы сказал, что лучший подход - "собрать" ваши агрегированные суммы отдельно и добавить значения к объектам модели в вашем коде.