2010-03-28 8 views
0

Ce que je veux est simple:Comment convertir cette requête en une "requête de modèle django"?

modèles:


class userLastTrophy(models.Model): 
    user  = models.ForeignKey(userInfo) 
    platinum = models.IntegerField() 
    gold = models.IntegerField() 
    silver = models.IntegerField() 
    bronze = models.IntegerField() 
    level = models.IntegerField() 
    rank = models.IntegerField() 
    perc_level = models.IntegerField() 
    date_update = models.DateTimeField(default=datetime.now, blank=True) 
    total = models.IntegerField() 
    points = models.IntegerField() 

class userTrophy(models.Model): 
    user  = models.ForeignKey(userInfo) 
    platinum = models.IntegerField() 
    gold = models.IntegerField() 
    silver = models.IntegerField() 
    bronze = models.IntegerField() 
    total = models.IntegerField() 
    level = models.IntegerField() 
    perc_level = models.IntegerField() 
    date_update = models.DateTimeField(default=datetime.now, blank=True) 
    rank = models.IntegerField(default=0) 
    total = models.IntegerField(default=0) 
    points = models.IntegerField(default=0) 
    last_trophy = models.ForeignKey(userLastTrophy, default=0) 

J'ai cette requête:


select t2.user_id as id, 
     t2.platinum - t1.platinum as plat, 
     t2.gold  - t1.gold as gold, 
     t2.silver - t1.silver as silver, 
     t2.bronze - t1.bronze as bronze, 
     t2.points - t1.points as points from myps3t_usertrophy t2, myps3t_userlasttrophy t1 where 
     t1.id = t2.last_trophy_id order by points; 

comment faire avec les modèles de django?

+0

Je pense que cela est mauvais conçu. Vous devriez avoir tout cela dans un modèle (c'est fondamentalement le même) et laissez 'last_trophy' se référer à lui-même. –

+0

qu'en est-il si j'ai besoin de plus d'un "userLastTrophy" par utilisateur, et d'un seul utilisateurTrophy? Y a-t-il une meilleure manière de faire cela ? et ce n'est qu'un exemple, savez-vous comment le faire dans les modèles django? – fabriciols

Répondre

0

juste en font un modèle avec un champ pour la date a été créé:

from django.contrib.auth.models import User 

class Trophy(models.Model): 
    user  = models.ForeignKey(User, related_name='trophies') 
    creation_date = model.DateField(auto_now_add=True) 

Vous remarquerez que:

  • nous avons mis la clé étrangère à un modèle utilisateur, et non informations utilisateur. De cette façon, vous pouvez obtenir l'utilisateur actuel et c'est trohys dans une vue facilement. make UserInfo a user profile
  • Trophée doit avoir sa première lettre majuscule. Et le préfixe de l'utilisateur est assez inutile, sauf si vous avez un trophée pour autre chose que les utilisateurs.
  • date de création, avec auto_now_add à true, sera mis automatiquement à la date actuelle lorsque le nouvel objet sera créé
  • nom lié vous permet de donner un nom naturel à l'inverse naturel au lieu d'obtenir « trophy_set »

Vous pouvez ensuite obtenu tous les derniers trophées de cette façon:

# we get the last 3 trophies, '-' sort from last to first 
print user.trophies.order_by('-creation_date')[:3] 
Questions connexes