【发布时间】:2014-09-04 12:09:33
【问题描述】:
我想使用 Django 的 ORM 运行过滤器,这样我就可以在每个用户的最新会话中获得一组不同的用户。我设置了表格,以便user 有很多sessions;有一个User 和Session 模型,Session 模型有一个user = models.ForeignKey(User)。
到目前为止我尝试的是Users.objects.distinct('username').order_by('session__last_accessed'),但我知道这不会起作用,因为 Django 将session.last_accessed 列放入选择中,因此它返回给我,例如,5 个重复的用户名和 5不同的会话,而不是单个最近的会话和用户。
是否可以通过 Django 的 ORM 查询?
编辑:好的,经过一些 SQL 测试后,我发现我要使用的 SQL 是:
select user.username, sub_query.last_accessed from (
select user_id, max(last_accessed) as last_accessed
from session
group by user_id
) sub_query
join user on
user.id = sub_query.user_id
order by sub_query.last_accessed desc
limit 5
我可以通过Session.objects.values('user').annotate(last_accessed=Max('last_accessed')) 做sub_query。如何使用这个sub_query 来通过 ORM 获取我想要的数据?
编辑 2:具体来说,我想通过只执行一个查询来做到这一点,就像上面的 SQL 一样。当然,我可以在 Python 中查询两次并进行一些处理,但我更愿意在使用 ORM 时访问数据库。
【问题讨论】:
标签: sql django django-orm