2017-03-01 1 views
0

J'ai un modèle Profile qui a un champ points comme suit:joueurs Classement en utilisant Django ORM (Postgres - RANK)

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) 

Ce que je veux faire est que le rang des utilisateurs en fonction de leurs points. Je peux le faire à l'aide d'une simple requête SQL brute qui est comme suit-

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

Ce qui me donne les Output- suivantes

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

Les données initiales était-

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) 

Le problème est que je suis incapable d'écrire une requête équivalente en utilisant ORM de Django

Répondre

1

Django < = 1.10 ne permet pas d'exprimer les fonctions de la fenêtre en pur Python. Toutefois, il est possible de combiner du code Python et du code SQL brut pour obtenir le résultat souhaité.

L'utilisation des fonctions de la fenêtre pour votre cas d'utilisation est déjà expliquée dans Stack Overflow ici, veuillez jeter un coup d'oeil: Clean way to use postgresql window functions in django ORM?