如下截图,存在这样一张表 student model 有三个字段 name 学生姓名 score 分数 created_time 记录创建时间
class StudentScore(models.Model):
name = models.CharField('姓名', max_length=128)
score = models.IntegerField(verbose_name='分数')
created_time = models.DateTimeField(auto_now_add=True)
每位学生可能有多条记录, 我需要用每位学生最新的一条记录,做一个排行榜, 用 django 的 orm 如何去查询?
1
ericls 2020-04-29 03:08:14 +08:00
from django.db.models import Max, Subquery, OuterRef
sub = Subquery(StudentScore.objects.filter(name=OuterRef('name')).values('score').order_by('-created_time')[:1]) query = StudentScore.values('name').annotate(latest_score=sub).order_by().dinstinct() 试试吧 |
2
ericls 2020-04-29 03:23:11 +08:00
排行榜的话 把 第二个 order_by() 写成 `order_by('latest_score')` 就行了
切记不能再 order_by 别的东西了,否则 group_by 就破了 |
3
guog 2020-04-29 04:45:09 +08:00 via Android
换个思路也可以,加一张排行榜表(或者直接用 Redis 存),原有的就当作记录表
|
4
vZexc0m 2020-04-29 08:12:10 +08:00 via Android
这张表只用做记录表,然后把每次的分数存入 redis 来做排行榜
|
5
robinlovemaggie 2020-04-29 09:50:47 +08:00
提句别的:单用 name 怎么避免学生重名问题?
|
6
wdxm2008 2020-04-29 10:00:24 +08:00
@robinlovemaggie 每个表 django 都有自己的创建的主键不用自己再建立了
|
7
luhuisicnu 2020-04-29 10:24:39 +08:00
设计上就有问题,应该多加一个字段,记录录入记录的批次,例如"第三次模拟考试"。然后按照这个字段来查询记录,保证查询到的记录都是对应的记录。然后做简单的 order 就可以得到结果。
你这样的表设计,如果查中间某次的分数,根本无从入手! |
8
aladdindingding 2020-04-29 13:59:08 +08:00
全查出来写个函数处理一下吧 python 有个 group 函数 然后根据时间选取最近的一个 ,当然要看看耗时
|
9
wizardoz 2020-04-29 15:42:03 +08:00 1
如果我有一次考了 100 分,后面的考试统统不参加,我是不是就永远第一名了?
|