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