以数据库无关的方式获取行号 - django
假设我有一个叫做'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 ) )
我觉得有很多很多种方法可以做到这一点。