Хотя результатом является ожидаемый результат, я чувствую, что я использую много вложений. Тем более что я использовал Ticket
а не Event
для total_outstanding_revenue
. Интересно, есть ли у вас лучший и короткий способ написать этот запрос?
Мой набор запросов дает мне следующий результат:
total_outstanding_revenue:
<QuerySet [{'event__pk': 4, 'total_outstanding_revenue': 56000}, {'event__pk': 5, 'total_outstanding_revenue': 9000}, {'event__pk': 6, 'total_outstanding_revenue': 29000}]>
Вот мой набор запросов:
outstanding_revenue = (
Ticket.objects.filter(pk=OuterRef('pk'))
.annotate(
sold_tickets=Count(
'attendees',
filter=Q(
attendees__canceled=False,
attendees__order__status__in=(
OrderStatus.PAID, OrderStatus.PENDING, OrderStatus.PARTIALLY_REFUNDED, OrderStatus.FREE
),
),
)
)
.annotate(
available_tickets=ExpressionWrapper(
F('quantity') - F('sold_tickets'), output_field=IntegerField()
)
)
.annotate(
outstanding_revenue=ExpressionWrapper(
F('available_tickets') * F('price_gross'), output_field=IntegerField()
)
)
.values('outstanding_revenue')
)
total_outstanding_revenue = Ticket.objects.filter(event__organizer=1, event__status=EventStatus.LIVE).annotate(
outstanding_revenue=Subquery(outstanding_revenue)).values(
'event__pk'
).annotate(total_outstanding_revenue=Sum('outstanding_revenue', output_field=IntegerField())).values(
'event__pk', 'total_outstanding_revenue'
).order_by()