aller chercher des numéros de ligne dans une base de données de façon indépendante - django
-
13-09-2019 - |
Question
Disons que j'ai un Scores table avec les champs 'utilisateur' , 'Note en' , 'ScoreB' , ScoreC . Dans une vue leaderboard je fetch et commander un queryset par l'un de ces domaines que le score de visiteur sélectionne. Le modèle pagine le queryset. La table est mise à jour par un travail sur des périodes régulières (une commande django déclenché par cron).
Je veux ajouter un champ 'rang' à la queryset pour que j'aurai 'rang' , 'utilisateur' , < strong> 'Note en' , ScoreB , ScoreC . De plus, je veux rester base de données indépendante (postgre est une option et pour le moment il ne supporte pas row_number ).
Une solution peut être que je peux modifier le travail, de sorte qu'il calcule aussi et écrit trois rangs différents dans trois nouveaux domaines ( Ranka , rankB , 'rankC' ).
J'espère qu'il ya une meilleure (beaucoup) solution?
La solution
Pourquoi ne pas calculer le rang dans le modèle?
{% for row in results_to_display %}
<tr><td>{{forloop.counter}}</td><td>{{row.scorea}}</td>...
{% endfor %}
Ou, vous pouvez calculer le rang dans la fonction de vue.
def fetch_ranked_scores( request ):
query = Score.objects.filter( ... ).orderby( scorea )
scores = [ r, s.scorea for r, s in enumerate(query) ]
return render_to_response ( template, { 'results_to_display':scores } )
Ou, vous pouvez calculer le classement dans le modèle.
class Score( models.Model ):
ScoreA = models.IntegerField( ... )
def ranked_by_a( self ):
return enumerate( self.objects.filter(...).orderby( scorea ) )
Je pense qu'il ya beaucoup de façons de le faire.