以与数据库无关的方式获取行号 - django

时间:2009-06-09 09:31:18

标签: python django django-orm

假设我有一个'得分'表,字段'用户''得分A''得分B' 'ScoreC'。在排行榜视图中,我通过访问者选择的任何一个得分字段来获取和订购查询集。模板对查询集进行分页。该表由常规期间的作业更新(由cron触发的django命令)。

我想在查询集中添加'排名'字段,以便我有'排名''用户',< strong>'ScoreA','ScoreB''ScoreC'。此外,我希望保持与数据库无关(postgre是一个选项,目前它不支持 row_number )。

解决方案可能是我可以修改作业,以便它还可以在三个新字段中计算和写入三个不同的等级('rankA''rankB''rankC')。

我希望有更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

为什么不能计算模板中的排名?

{% for row in results_to_display %}
    <tr><td>{{forloop.counter}}</td><td>{{row.scorea}}</td>...
{% endfor %}

或者,您可以在视图函数中计算排名。

def fetch_ranked_scores( request ):
    query = Score.objects.filter( ... ).orderby( scorea )
    scores = [ r, s.scorea for r, s in enumerate(query) ]
    return render_to_response ( template, { 'results_to_display':scores } )

或者,您可以计算模型中的排名。

 class Score( models.Model ):
     ScoreA = models.IntegerField( ... )
     def ranked_by_a( self ):
         return enumerate( self.objects.filter(...).orderby( scorea ) )

我认为有很多方法可以做到这一点。