/ / Niestandardowa adnotacja agregująca w Django - python, django, django-models, django-views, django-queryset

Niestandardowe zagregowane adnotacje w Django - python, django, django-models, django-views, django-queryset

Mam wiele grup, z których każda ma rewizję, a każda wersja ma kilka miesięcy.

Chcę wydrukować wszystkie obiekty grupy z adnotacją.

Dla każdej grupy powinna wybierać tylko najnowszą wersję, a następnie sumować wszystkie miesiące.

Nie jestem pewien, czy można to zrobić w Django. Próbowałem czegoś takiego

Group.objects.annotate(
month_sum=Revision.objects.filter(date__lte=my_date).latest("date").aggregate(Sum("months__amount"))
)

i miał nadzieję uzyskać zestaw zapytań ze wszystkimi grupami, z których każda ma sumę month_sum.

Odpowiedzi:

0 dla odpowiedzi № 1

Czy możesz spróbować tego:

qs = Group.objects.filter(revision__date__lte=my_date).annotate(month_sum=Sum("months__amount"))

Możesz debugować i próbować wykluczyć, jak wykonać odpowiednie zapytanie, drukując wygenerowane zapytanie DB w powłoce:

print str(qs.query)

Edytować:

Myślę, że aby pokazać nawet Grupy ze starą wersją django-aggregate-if może ci pomóc

Biegać pip install django-aggregate-if

from django.db.models import Q
from aggregate_if import Sum

revision = Revision.objects.filter(revision__date__lte=my_date).latest()
qs = Group.objects.all().annotate(month_sum=Sum("months__amount", only=Q(revision=revision)))