Джанго: Совокупность за "событие__pk" - PullRequest
2 голосов
/ 14 июня 2019

Я получаю эти результаты запроса

<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 Ответ

3 голосов
/ 14 июня 2019

Вы должны исключить 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 s будет иметь дополнительный атрибут total_gross, который содержит сумму билетов (их quantity умноженная на price_gross).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...