python - 如何在 order_by 之后获取结果在列表中的位置?

标签 python sql django rank

我正在尝试找到一种有效的方法来查找数据库中与其分数相关的对象的排名。我天真的解决方案如下所示:

rank = 0
for q in Model.objects.all().order_by('score'):
  if q.name == 'searching_for_this'
    return rank
  rank += 1

应该可以使用 order_by 让数据库进行过滤:

Model.objects.all().order_by('score').filter(name='searching_for_this')

但是似乎没有办法在过滤器之后检索 order_by 步骤的索引。

有更好的方法吗? (使用 python/django 和/或原始 SQL。)

我的下一个想法是在插入时预先计算排名,但这看起来很困惑。

最佳答案

我认为您无法使用 Django ORM 在一个数据库查询中执行此操作。但如果它不打扰你,我会在模型上创建一个自定义方法:

from django.db.models import Count

class Model(models.Model):
    score = models.IntegerField()
    ...

    def ranking(self):
        count = Model.objects.filter(score__lt=self.score).count()
        return count + 1

然后您可以在任何地方使用“排名”,就好像它是一个普通字段一样:

print Model.objects.get(pk=1).ranking

编辑: 这个答案来自 2010 年。现在我会推荐 Carl's solution相反。

关于python - 如何在 order_by 之后获取结果在列表中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659245/

相关文章:

sql - 这个查询可以更干吗?

Python/Django 1.5 DatabaseWrapper 线程错误

python - 无法在 Docker 上托管语音识别和声音播放应用程序

python - 查找操作的基数是否会影响其运行速度,或者只是计算某些标准偏移量的方式?

python - mongodb find 查询返回的结果不一致

php - 将一个查询的结果传递到另一个查询中

python - GIS/Gdal/OSGeos 在 Windows 上的 django 中导入错误

mysql - 如何使用 SQL 连接 postmeta 表并获取自定义字段日期之前的帖子

django - 在 Django Rest 框架中调用 save() 进行发布时出现问题

python - Django:查询数据库