我有以下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查询(带子查询).