【问题标题】:Django: Aggregate per "event__pk"Django:按“event__pk”聚合
【发布时间】:2019-10-29 10:08:52
【问题描述】:

我得到了这些查询结果

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

【问题讨论】:

  • Ticket 是否引用了Category
  • 活动可以有多张门票。 (每人可以购买现场活动的门票。)

标签: python django


【解决方案1】:

您应该从值中排除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'))
)

那么Events 将有一个额外的属性total_gross,其中包含票的总和(他们的quantity 乘以他们的price_gross)。

【讨论】:

  • 哦,哇,将 Sum 移动到您放置它的位置 1) 实际上解决了它。惊人的。关于2)那没有用。我认为原因是我每次活动都有不止一张票。有解决方案吗?否则我会采取 1)
  • @JoeyCoder:我在第二个中打错了,是price_gross 而不是prices_gross。以上应该可以工作,因为它将在Sum(..) 中考虑所有相关的Tickets。
  • 我仍然收到Cannot resolve keyword 'ticket' into field.。现在我尝试在 2) 中将 ticket 更改为 tickets。然后我回了<EventQuerySet [Event: Now Look Attorney, Event: Revenue Test, Event: Revenue Test 2]>。但是,它似乎只是忽略了total_gross
  • @JoeyCoder:您是否为从TicketEventForeignKey 指定了related_name
  • 是的,相关名称是tickets
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2010-12-20
  • 2017-12-31
  • 2019-12-17
  • 2020-06-08
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多