/ Anotação agregada customizada no Django - python, django, django-models, django-views, django-queryset

Anotação agregada personalizada no Django - python, django, django-models, django-views, django-queryset

Eu tenho muitos grupos que cada um tem uma revisão e cada revisão tem alguns meses.

Eu quero produzir todos os objetos do grupo com uma anotação.

Para cada grupo, basta selecionar a revisão mais recente e somar todos os meses.

Eu não tenho certeza se isso pode ser feito no Django. Eu tentei algo como

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

e esperava obter um queryset com todos os grupos, cada um com uma soma month_sum.

Respostas:

0 para resposta № 1

Você pode tentar este:

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

Você pode depurar e tentar entender como fazer a consulta correta imprimindo a consulta de banco de dados gerada no shell:

print str(qs.query)

Editar:

Para mostrar até mesmo grupos com revisão antiga eu acho django-agregado-se pode te ajudar

Corre 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)))