我的+----+------+-----+----+
| 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写一个等价查询
答案 0 :(得分:1)
Django< = 1.10不允许用纯Python表达窗口函数。
但是,可以将Python代码和原始SQL结合起来以实现所需的结果。
在Stack Overflow中已经解释了如何使用窗口函数,请查看:Clean way to use postgresql window functions in django ORM?