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

1 投票
1 回答
2848 浏览
提问于 2025-04-15 12:07

假设我有一个叫做'Scores'的表格,里面有'User'(用户)、'ScoreA'(得分A)、'ScoreB'(得分B)、'ScoreC'(得分C)这些字段。在排行榜的界面上,我会根据访客选择的得分字段来获取和排序数据。然后,模板会把这些数据分页显示。这个表格会定期更新(通过一个定时任务来执行django命令)。

我想在获取的数据中添加一个'rank'(排名)字段,这样我就能看到'rank''User''ScoreA''ScoreB''ScoreC'这些信息。此外,我希望这个方案不依赖于特定的数据库(比如说,虽然可以用Postgre,但目前它不支持row_number这个功能)。

一个可能的解决办法是,我可以修改这个定时任务,让它计算并写入三个不同的排名到三个新的字段中('rankA''rankB''rankC')。

我希望能有一个(更好得多的)解决方案?

1 个回答

4

为什么你不能在模板中计算排名呢?

{% 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 ) )

我觉得有很多很多种方法可以做到这一点。

撰写回答