繁体   English   中英

带有QuerySet对象的Django查询

[英]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个) 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 = 
GROUP BY event.id
HAVING COUNT(register.id) > 20

使用org_obj_id时, org_obj对象的主键值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM