如何使用Django Queryset在列中找到top-X最高值而不切断底部的关系?

 少爷自控_592 发布于 2023-02-03 09:18

我有以下Django模型:

class myModel(models.Model):
    name = models.CharField(max_length=255, unique=True)
    score = models.FloatField()

此模型的数据库中有数千个值.我想高效优雅地使用QuerySets获得前十名最高分,并按分数的降序显示名称.到目前为止它相对容易.

这里是皱纹的地方:如果有多个myModel并列第十名,我想全部展示它们.我不想只看到其中一些.这会过度地使某些名字比其他名字具有任意优势.如果绝对必要,我可以在Querysets之外进行一些后DB列表处理.但是,我看到的主要问题是我无法通过apriori将我的数据库查询限制在前10个元素中,因为据我所知,可能有一百万条记录都排在第十位.

我是否需要按分数对所有myModel进行排序,然后对它们进行一次传递以计算得分阈值?然后使用该计算得分阈值作为另一个Queryset中的过滤器?

如果我想用直接SQL编写这个,我甚至可以在一个查询中完成它吗?

1 个回答
  • 当然,您可以在一个SQL查询中执行此操作.使用django ORM生成此查询也很容易实现.

    top_scores = (myModel.objects
                         .order_by('-score')
                         .values_list('score', flat=True)
                         .distinct())
    top_records = (myModel.objects
                          .order_by('-score')
                          .filter(score__in=top_scores[:10]))
    

    这应该生成单个SQL查询(带子查询).

    2023-02-03 09:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有