V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijintaotzx
V2EX  ›  Django

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

  •  
  •   lijintaotzx · 2020-04-29 02:33:47 +08:00 · 3325 次点击
    这是一个创建于 1672 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    9 条回复    2020-04-29 15:42:03 +08:00
    ericls
        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()

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

    切记不能再 order_by 别的东西了,否则 group_by 就破了
    guog
        3
    guog  
       2020-04-29 04:45:09 +08:00 via Android
    换个思路也可以,加一张排行榜表(或者直接用 Redis 存),原有的就当作记录表
    vZexc0m
        4
    vZexc0m  
       2020-04-29 08:12:10 +08:00 via Android
    这张表只用做记录表,然后把每次的分数存入 redis 来做排行榜
    robinlovemaggie
        5
    robinlovemaggie  
       2020-04-29 09:50:47 +08:00
    提句别的:单用 name 怎么避免学生重名问题?
    wdxm2008
        6
    wdxm2008  
       2020-04-29 10:00:24 +08:00
    @robinlovemaggie 每个表 django 都有自己的创建的主键不用自己再建立了
    luhuisicnu
        7
    luhuisicnu  
       2020-04-29 10:24:39 +08:00
    设计上就有问题,应该多加一个字段,记录录入记录的批次,例如"第三次模拟考试"。然后按照这个字段来查询记录,保证查询到的记录都是对应的记录。然后做简单的 order 就可以得到结果。
    你这样的表设计,如果查中间某次的分数,根本无从入手!
    aladdindingding
        8
    aladdindingding  
       2020-04-29 13:59:08 +08:00
    全查出来写个函数处理一下吧 python 有个 group 函数 然后根据时间选取最近的一个 ,当然要看看耗时
    wizardoz
        9
    wizardoz  
       2020-04-29 15:42:03 +08:00   ❤️ 1
    如果我有一次考了 100 分,后面的考试统统不参加,我是不是就永远第一名了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:51 · PVG 04:51 · LAX 12:51 · JFK 15:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.