Django 的 ORM 查询问题,求大神解救!

2020-04-29 02:33:47 +08:00
 lijintaotzx

如下截图,存在这样一张表 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 如何去查询?

3356 次点击
所在节点    Django
9 条回复
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()

试试吧
ericls
2020-04-29 03:23:11 +08:00
排行榜的话 把 第二个 order_by() 写成 `order_by('latest_score')` 就行了

切记不能再 order_by 别的东西了,否则 group_by 就破了
guog
2020-04-29 04:45:09 +08:00
换个思路也可以,加一张排行榜表(或者直接用 Redis 存),原有的就当作记录表
vZexc0m
2020-04-29 08:12:10 +08:00
这张表只用做记录表,然后把每次的分数存入 redis 来做排行榜
robinlovemaggie
2020-04-29 09:50:47 +08:00
提句别的:单用 name 怎么避免学生重名问题?
wdxm2008
2020-04-29 10:00:24 +08:00
@robinlovemaggie 每个表 django 都有自己的创建的主键不用自己再建立了
luhuisicnu
2020-04-29 10:24:39 +08:00
设计上就有问题,应该多加一个字段,记录录入记录的批次,例如"第三次模拟考试"。然后按照这个字段来查询记录,保证查询到的记录都是对应的记录。然后做简单的 order 就可以得到结果。
你这样的表设计,如果查中间某次的分数,根本无从入手!
aladdindingding
2020-04-29 13:59:08 +08:00
全查出来写个函数处理一下吧 python 有个 group 函数 然后根据时间选取最近的一个 ,当然要看看耗时
wizardoz
2020-04-29 15:42:03 +08:00
如果我有一次考了 100 分,后面的考试统统不参加,我是不是就永远第一名了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX