Bob*_*Bob 7 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
Run Code Online (Sandbox Code Playgroud)
应该可以使用order_by让数据库进行过滤:
Model.objects.all().ORDER_BY( '得分').过滤器(名称= '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):
aggregate = Model.objects.filter(score__lt=self.score).aggregate(ranking=Count('score'))
return aggregate['ranking'] + 1
Run Code Online (Sandbox Code Playgroud)
然后,您可以在任何地方使用"排名",就好像它是一个普通字段:
print Model.objects.get(pk=1).ranking
Run Code Online (Sandbox Code Playgroud)
使用Django 2.0中的新Window函数,您可以像这样编写它...
from django.db.models import Sum, F
from django.db.models.expressions import Window
from django.db.models.functions import Rank
Model.objects.filter(name='searching_for_this').annotate(
rank=Window(
expression=Rank(),
order_by=F('score').desc()
),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2659 次 |
| 最近记录: |