我正在使用Django 1.6和Mysql。
我有这些模型:
class Student(models.Model):
username = models.CharField(max_length=200, unique = True)
class Score(models.Model):
student = models.ForeignKey(Student)
date = models.DateTimeField()
score = models.IntegerField()
我想得到每个学生的最新成绩记录。
我试过:
Score.objects.values('student').annotate(latest_date=Max('date'))
以及:
Score.objects.values('student__username').annotate(latest_date=Max('date'))
正如所描述的Django ORM - Get the latest record for the group,但它没有帮助。
5条答案
按热度按时间lskq00tm1#
如果您的数据库是postgres,它支持
distinct()
on field,您可以尝试oewdyzsn2#
这应该可以在Django 1.2+和MySQL上使用:
mwngjboj3#
我相信这会给予你学生和数据
如果您想要完整的
Score
记录,似乎您将不得不使用原始SQL查询:Filtering Django Query by the Record with the Maximum Column Valuexu3bshqb4#
已经有一些很好的答案了,但是没有一个提到窗口函数。
以下示例使用相应学生得最新分数注解所有分数对象:
这将产生以下SQL(使用Sqlite后端):
所需的信息已经存在,但是我们还可以将该查询集简化为
student_id
和latest_score
的唯一组合的集合。例如,在PostgreSQL上,我们可以使用distinct和字段名,如
scores.distinct('student')
。在其他数据库后端,我们可以执行类似
set(scores.values_list('student_id', 'latest_score'))
的操作,尽管这会评估查询集。不幸的是,在撰写本文时,还不能过滤窗口化查询集。
shyt4zoc5#
下面是一个使用
Greatest
和辅助annotate
的示例。我遇到了一个问题,即注解返回重复记录(示例),但last_message_time
Greatest注解导致了重复。参考文献:
from django.db.models import Max