使用Django ORM排名球员(Postgres - RANK)

时间:2017-03-01 16:48:14

标签: django postgresql django-models django-orm

我的+----+------+-----+----+ | ID | Name | Val | s | +----+------+-----+----+ | 1 | A | 2 | 16 | | 2 | B | 5 | 14 | | 3 | C | 2 | 9 | | 4 | D | 7 | 7 | | 5 | E | 0 | 0 | +----+------+-----+----+ 模型的Profile字段如下:

points

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

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)

这给了我以下输出 -

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)

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

1 个答案:

答案 0 :(得分:1)

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

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

在Stack Overflow中已经解释了如何使用窗口函数,请查看:Clean way to use postgresql window functions in django ORM?