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

前端之家收集整理的这篇文章主要介绍了sql – 如何使用Django Queryset在列中找到top-X最高值而不截断底部的关系?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下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查询(带子查询).

猜你在找的MsSQL相关文章