Набор запросов с OuterRef - PullRequest
0 голосов
/ 21 июня 2019

Хотя результатом является ожидаемый результат, я чувствую, что я использую много вложений. Тем более что я использовал 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...