[英]django query with QuerySet objects
假设这是我的模型
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(
nregister=Count('ticket__register')
).filter(nregister__gt=20)
这是一个QuerySet
,其中包含与此Organizer
相关的Event
,(具有严格限制)20个以上相关的Register
对象。 您可以对nregister__gte=20
进行过滤,以获取具有20个或更多(包括20个) Register
的Event
。
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 =
GROUP BY event.id
HAVING COUNT(register.id) > 20
使用org_obj_id
时, org_obj
对象的主键值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.