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

Ranking players using Django ORM (Postgres - RANK)

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

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 ;

这给了我以下输出-

 id | rank 
----+------
  1 |    1
  2 |    2
  3 |    2
  4 |    2
(4 rows)

初始数据是-

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 编写等效查询

Django <=1.10 不允许在纯 Python.

中表达 window 函数

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

在 Stack Overflow 上已经对您的用例使用 window 函数进行了说明,请查看: