加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何使用Django Queryset在列中找到top-X最高值而不截断

发布时间:2020-12-12 06:47:18 所属栏目:MsSql教程 来源:网络整理
导读:我有以下Django模型: class myModel(models.Model): name = models.CharField(max_length=255,unique=True) score = models.FloatField() 此模型的数据库中有数千个值.我想高效优雅地使用QuerySets来获得前十名的最高分,并按分数的降序显示他们的分数.到目前
我有以下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编写这个,我甚至可以在一个查询中执行此操作吗?

解决方法

当然,您可以在一个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查询(带子查询).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读