66

我正在将 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 所述 - 获取该组的最新记录, 但它没有帮助。

4

4 回答 4

75

如果您的数据库是支持distinct()现场的 postgres,您可以尝试

Score.objects.order_by('student__username', '-date').distinct('student__username')
于 2013-11-12T08:21:11.513 回答
40

这应该适用于 Django 1.2+ 和 MySQL:

Score.objects.annotate(
  max_date=Max('student__score__date')
).filter(
  date=F('max_date')
)
于 2013-11-12T13:43:36.237 回答
7

我相信这会给你学生和数据

Score.objects.values('student').annotate(latest_date=Max('date'))

如果您想要完整的Score记录,您似乎必须使用原始 SQL 查询:Filtering Django Query by the Record with the Maximum Column Value

于 2013-11-12T08:19:00.873 回答
-1

Greatest这是一个使用辅助的示例annotate。我正面临注释返回重复记录(示例)的问题,但last_message_time最伟大的注释导致重复。

qs = (
            Example.objects.filter(
                Q(xyz=xyz)
            )
            .exclude(
                 Q(zzz=zzz)
            )
            # this annotation causes duplicate Examples in the qs
            # and distinct doesn't work, as expected
            # .distinct('id') 
            .annotate(
                last_message_time=Greatest(
                    "comments__created",
                    "files__owner_files__created",
                )
            )
            # so this second annotation selects the Max value of the various Greatest
            .annotate(
                last_message_time=Max(
                    "last_message_time"
                )
            )
            .order_by("-last_message_time")
    )

参考:

于 2020-10-23T21:56:27.463 回答