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