繁体   English   中英

Django按外键排序布尔字段

[英]Django Sort By ForeignKey Boolean Field

我有一个问题,我想用Django的ORM来解决。 我有以下课程:

class Company:
    name = models.CharField(max_length=200)

class Event:
    title = models.CharField(max_length=200)
    company = models.ForeignKey(Company)

class Registration:
    attended = models.BooleanField(default=False)
    event = models.ForeignKey(Event)

这些都是简单的例子,但基本上公司可以有几个事件。 当用户注册参加活动时,会为该用户创建注册(我知道该字段不存在,这不是问题)。 如果用户实际显示事件,则该用户的Registration对象将具有“attend = True”。

我目前正在生成报告,而我所需要的实际上是让公司看到他们所有活动的方式,并按参加人数排序(注册人数为“参加人数=真”)。

我有一个SQL语句,可以让你知道我需要什么(除了而不仅仅是“e.title”,显然QuerySet会给我回整个对象):

SELECT e.title FROM example_event e LEFT JOIN (SELECT event_id,
COUNT(*) attendees FROM example_registration WHERE attended=1 GROUP BY
event_id) r ON (e.id=r.event_id) ORDER BY r.attendees DESC;

这给了我一个正确排序的事件标题结果集。 但我真的想在ORM中执行此操作并返回QuerySet。 有没有办法做到这一点? 我基本上需要这样的东西:

events.annotate(attendees=Count('registration__attended=True'))
                .order_by('attendees')

......我知道这句话是无效的,但它希望能够解决我想要完成的事情。 此外,我需要始终返回公司的所有事件,因为它是一份报告。 他们希望看到他们所有活动的表现如何,即使他们有0个与会者(因此像events.filter(registration__attended=True)这样的东西不会给我我需要的东西,因为它只返回公司活动的一部分)。

在此先感谢,我真的很感谢有人的帮助!

我不确定您是否要排除使用extra方法,但您可以执行以下操作:

events = Event.objects.extra(
    select={'attendees': 'SELECT COUNT(*) from event_registration' + \
        ' where attended=1 and event_id=event_event.id'}
).order_by('attendees')

这应该工作:

events.filter(registration__attended=True)\
      .annotate(attendees=Count('registration'))\
      .order_by('attendees')

请注意filter()annotate()方法不可交换。 所以查询之间有区别:

>>> events.annotate(attendees=Count('registration')).filter(registration__attended=True)

>>> events.filter(registration__attended=True).annotate(attendees=Count('registration'))

阅读文档中的更多内容

暂无
暂无

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

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