以独立于数据库的方式获取行号 - django

发布于 2024-07-23 22:35:56 字数 644 浏览 5 评论 0原文

假设我有一个 'Scores' 表,其中包含字段 'User''ScoreA''ScoreB' >,'ScoreC'。 在排行榜视图中,我通过访问者选择的这些分数字段之一获取并排序查询集。 该模板对查询集进行分页。 该表由作业定期更新(由 cron 触发的 django 命令)。

我想向查询集中添加一个 'rank' 字段,以便我将拥有 'rank''User''得分A''得分B''得分C'。 此外,我想保持数据库独立性(postgre 是一个选项,目前它不支持 row_number)。

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

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

Let's say that I have a 'Scores' table with fields 'User','ScoreA', 'ScoreB', 'ScoreC'. In a leaderboard view I fetch and order a queryset by any one of these score fields that the visitor selects. The template paginates the queryset. The table is updated by a job on regular periods (a django command triggered by cron).

I want to add a 'rank' field to the queryset so that I will have 'rank', 'User', 'ScoreA', 'ScoreB', 'ScoreC'. Moreover I want to remain database-independent (postgre is an option and for the time being it does not support row_number).

A solution may be that I can modify the job, so that it also computes and writes three different ranks in three new fields ('rankA', 'rankB', 'rankC').

I hope there is a (much) better solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

可是我不能没有你 2024-07-30 22:35:56

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

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

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

Why can't you compute the rank in the template?

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

Or, you can compute the rank in the view function.

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 } )

Or, you can compute the ranking in the model.

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

I think there are many, many ways to do this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文