gpt4 book ai didi

python - 使用 QuerySet 对象进行 django 查询

转载 作者:行者123 更新时间:2023-12-01 01:14:22 25 4
gpt4 key购买 nike

假设这是我的模型

class Organizer(models.Model):
# properties
class Event(models.Model):
organizer = models.ForeignKey(Organizer,on_delete=models.CASCADE)
# other properties
class Ticket(models.Model):
event = models.ForeignKey(Event,on_delete=models.CASCADE)
# other properties
class Register(models.Model):
ticket = models.ForeignKey(Ticket, on_delete=models.SET_NULL, null=True)

我有一个 Organizer 对象 org_obj,我想获取为此 Organizer 创建的拥有超过 20 个寄存器的所有事件的列表

这是我的代码:

events = Event.objects.filter(organizer=org_obj)
event20 = []
for e in events.iterator():
tickets = Ticket.objects.filter(event=e)
tickets_sold = 0
for t in tickets.iterator():
tickets_sold += Register.objects.filter(ticket=t).count()
if tickets_sold > 20:
event20.append(e)

是否可以不使用循环来改进此查询?在普通 SQL 中,这应该可以通过 join 表达式和子查询实现。

最佳答案

您只需用 Register 的数量注释您的 Event,然后对其进行过滤,例如:

from django.db.models import Count

event20 = org_obj.event_set.annotate(
<b>nregister=Count('ticket__register')</b>
).filter(<b>nregister__gt=20</b>)

这是一个 QuerySet,其中包含与此 Organizer 相关的 Event,并且(严格)有 20 多个相关的 Register 对象。您可以过滤 nregister__gte=20 以获取具有 20 个或更多(因此包含 20 个)RegisterEvent

Django 将构造一个类似于以下内容的查询:

SELECT event.*,
COUNT(register.id) AS nregister
FROM event
LEFT OUTER JOIN ticket ON event.id = ticket.event_id
LEFT OUTER JOIN register ON ticket.id = register.ticket_id
WHERE event.organizer_id = <i>org_obj_id</i>
GROUP BY event.id
HAVING COUNT(register.id) > 20

使用org_obj_idorg_obj对象的主键值。

关于python - 使用 QuerySet 对象进行 django 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54502731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com