我有一个想使用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)


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

我当前正在生成报告,而实际上我需要的是一种让公司查看其所有活动,并按参加人数进行分类的方法(注册为“ attended = 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')

09-27 08:29