Джанго: Создание набора запросов? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь получить следующий результат <EventQuerySet [{4: 10000, 5: 20000, [...]}]>.

Способ "получить" есть следующий рабочий процесс:

1) Получить каждое активное событие организатора

def organizers(self):
    return self.request.user.organizers

Event.objects.filter(
    organizer__in=self.organizers,
    status=EventStatus.LIVE
)

2) Для каждого события> получить все билеты, которые принадлежат этому конкретному событию.Особенно мне нужно получить доступ к количеству и цене каждого билета

3) Получить количество уже проданных билетов

.annotate(
    sold_tickets=Count('attendees', filter=Q(attendees__canceled=False))
)
.order_by('organizer')

4) Теперь у нас есть вся необходимая информациядля расчета max_remaining_gross_sale на событие:

Пример:

Событие с пк 4

Билет 1: цена_гросс *(количество - продано_клеток)

Билет 2: цена_брос * (количество - продано_клеток)

Событие с пк 5

Билет 1: цена_гросс * (количество- sold_tickets)

[...]

5) Из всех билетов на событие мы собираем сумму и получаем следующий результат: <EventQuerySet [{4: 10000, 5: 20000, [...]}]>

Я не сделалудается построить этот QuerySet таким образом, который дает мне результат из 5).У вас есть какой-нибудь совет для меня?

Здесь мои модели с соответствующими полями:

class Ticket(TimeStampedModel):
    quantity = models.PositiveIntegerField(
        verbose_name=_("Quantity"),
        validators=[MinValueValidator(1), MaxValueValidator(100_000)],
    )
    status = models.CharField(
        max_length=8,
        choices=TicketStatus.CHOICES,
        default=TicketStatus.ON_SALE,
        verbose_name=_("Status"),
    )
    price_gross = models.PositiveIntegerField(
        verbose_name=_("Price gross"), help_text=_("Includes tax if you set any.")
    )

class Event(TimeStampedModel):
    status = models.CharField(
        max_length=8,
        choices=EventStatus.CHOICES,
        default=EventStatus.LIVE,
        verbose_name=_("Status"),
    )
    organizer = models.ForeignKey(
        Organizer, on_delete=models.PROTECT, related_name='events'
    )

class Attendee(TimeStampedModel):
    ticket = models.ForeignKey(
        Ticket, on_delete=models.PROTECT, related_name='attendees'
    )  # PROTECT = don't allow to delete the ticket if an attendee exists
    event = models.ForeignKey(
        Event, on_delete=models.PROTECT, related_name='attendees'
    )
    canceled = models.BooleanField(default=False, verbose_name=_("Canceled"))

1 Ответ

0 голосов
/ 20 июня 2019

РЕДАКТИРОВАТЬ: Подожди - я исключил твой фильтр отмены

Исходя из моих предложенных изменений, я думаю, что это должно работать: Event.objects.annotate(max_remaining_gross_sale=Sum(F('tickets__price_gross')*(F('tickets__quantity')-F('tickets__attendees')), output_field=FloatField())).values()

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