Skip to main content
 首页 » 编程设计

python之Django:按 "event__pk"聚合

2024年08月13日39zhenyulu

我得到这些查询结果

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

请您参考如下方法:

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

from django.db.models import <b>Sum</b> 
 
max_total_gross_per_ticket = Ticket.objects.filter( 
    event__organizer__in=self.organizers, 
    event__status=EventStatus.LIVE, 
).values(<b>'event__pk'</b>).annotate( 
    total_gross=<b>Sum(</b>F('quantity') * F('price_gross')<b>)</b>, 
).order_by('event__pk')

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

from django.db.models import <b>Sum</b> 
 
Event.objects.filter( 
    organizer__in=self.organizers, 
    status=EventStatus.LIVE 
).annotate( 
    <b>total_gross=Sum(F('tickets__quantity') * F('tickets__price_gross'))</b> 
)

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