首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Django ORM (Postgres - Ranking )对玩家进行排名

使用Django ORM (Postgres - Ranking )对玩家进行排名
EN

Stack Overflow用户
提问于 2017-03-02 00:48:14
回答 1查看 553关注 0票数 0

我有一个包含points字段的Profile模型,如下所示:

代码语言:javascript
复制
class Profile(models.Model):
    user = models.OneToOneField(User)
    avatar = models.ImageField(default=None, null=True)
    experience = models.IntegerField(default=10)
    island = models.ForeignKey(Island, default=None, null=True)
    fcm_token = models.CharField(max_length=255, default=None, null=True, unique=True)
    points = models.DecimalField(default=0.0, max_digits=12, decimal_places=10)

我想做的是根据用户的积分对用户进行排名。我可以使用一个简单的原始SQL查询来完成,如下所示-

select id, RANK() over (order by points desc) as rank from player_profile ;

这给出了以下输出-

代码语言:javascript
复制
 id | rank 
----+------
  1 |    1
  2 |    2
  3 |    2
  4 |    2
(4 rows)

初始数据是-

代码语言:javascript
复制
id | avatar | experience | fcm_token | user_id | island_id |    points    
----+--------+------------+-----------+---------+-----------+--------------
  2 |        |         10 |           |       3 |         4 | 0.0000000000
  3 |        |         10 |           |       4 |         3 | 0.0000000000
  4 |        |         10 |           |       5 |         1 | 0.0000000000
  1 |        |         10 |           |       2 |         3 | 5.1010101010
(4 rows)

问题是我无法使用Django的ORM编写等价的查询

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 01:11:31

Django <=1.10不允许用纯Python表达窗口函数。

但是,可以将Python代码和原始SQL结合起来以获得所需的结果。

在堆栈溢出中已经解释了使用窗口函数的用例,请看一下:Clean way to use postgresql window functions in django ORM?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42537427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档