Django:每个“ event__pk”的汇总

时间:2019-06-14 18:57:06

标签: python django

我得到这些查询结果

<QuerySet [{'event__pk': 4, 'pk': 15, 'total_gross': 12340000}, {'event__pk': 4, 'pk': 13, 'total_gross': 123000}, {'event__pk': 5, 'pk': 22, 'total_gross': 1234000}]>

我要解决的问题是我尝试汇总total_gross 每个事件。但是,总是在我添加.aggregate(Sum('total_gross'))时,Django才聚合所有内容。知道如何解决这个问题吗?

max_total_gross_per_ticket = (
    Ticket.objects.filter(
        event__organizer__in=self.organizers,
        event__status=EventStatus.LIVE,
    ).values('event__pk', 'pk')
    .order_by('event__pk')
    .annotate(
        total_gross=F('quantity') * F('price_gross'),
    )
    # .aggregate(Sum('total_gross'))
)

1 个答案:

答案 0 :(得分:3)

您应该从值中排除pk,还应该在注释中添加Sum(..)函数:

from django.db.models import Sum

max_total_gross_per_ticket = Ticket.objects.filter(
    event__organizer__in=self.organizers,
    event__status=EventStatus.LIVE,
).values('event__pk').annotate(
    total_gross=Sum(F('quantity') * F('price_gross')),
).order_by('event__pk')

在这里注释Event对象更有意义,例如:

from django.db.models import Sum

Event.objects.filter(
    organizer__in=self.organizers,
    status=EventStatus.LIVE
).annotate(
    total_gross=Sum(F('tickets__quantity') * F('tickets__price_gross'))
)

然后,Event将具有一个额外的属性total_gross,其中包含票证的总和(其quantity乘以其price_gross的票数)。