首页 > 解决方案 > Django:创建查询集?

问题描述

我试图得到以下结果<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每个事件所需的所有信息:

例子:

PK 4 事件

门票 1:price_gross *(数量 - sold_tickets)

门票 2:price_gross *(数量 - sold_tickets)

PK 5 事件

门票 1:price_gross *(数量 - sold_tickets)

[...]

5)从每个事件的所有门票中,我们建立总和并得到以下结果: <EventQuerySet [{4: 10000, 5: 20000, [...]}]>

我没有设法以一种可以给我 5) 的结果的方式构建该 QuerySet。你对我有什么建议吗?

这是我的相关领域的模型:

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

标签: pythondjango

解决方案


编辑:等一下 - 我忽略了你的取消过滤器

根据我建议的编辑,我认为这应该可行: Event.objects.annotate(max_remaining_gross_sale=Sum(F('tickets__price_gross')*(F('tickets__quantity')-F('tickets__attendees')), output_field=FloatField())).values()


推荐阅读