2009-05-09 9 views
1

Je travaille avec Django.où mettre la méthode qui fonctionne sur un modèle

J'ai un modèle appelé Agrument. Les arguments ont des côtés et des propriétaires. J'ai une fonction qui retourne le côté de l'argument le plus récent d'un certain utilisateur.

comme obj.get_current_side (nom d'utilisateur)

J'ai ajouté ceci au modèle réel Argument comme celui-ci

def get_current_side(self, user): 
     return self.argument_set.latest('pub_date').side 

Je commence à penser que cela n'a pas de sens, car il ne peut pas être une instance d'un argument. Est-ce un endroit où j'utiliserais une méthode de classe? J'ai pensé à faire une classe util, mais je pense qu'il est logique d'être associé à la classe Argument.

Répondre

0

Je pense que ce que vous cherchez sont des gestionnaires de modèles.

Django docs on managers Avec les gestionnaires, vous pouvez ajouter une fonction à la classe de modèle au lieu d'une instance de modèle.

2

Il serait plus logique d'avoir des méthodes d'instance sur le modèle User:

def get_current_side(self): 
    try: 
     return self.arguments.latest('pub_date').side 
    except User.DoesNotExist, e: 
     return None 

Vous pouvez le faire en étendant le modèle User comme expliqué ici:

Modifier: Je ne suis pas sûr exactement quelle exception est levée.

1

Cela devrait être une méthode sur un gestionnaire de modèle personnalisé:

# in models.py 
class ArgumentManager(models.manager.Manager): 
    def get_current_side(self, user): 
     try: 
      return self.filter(user=user).latest('pub_date').side 
     except Argument.DoesNotExist: 
      return None 

class Argument(models.Model): 
    # fields etc... 

    objects = ArgumentManager() 


# Calling: 

side = Argument.objects.get_current_side(user) 

Alternaticely vous peut étendre contrib.auth.user et ajouter get_current_size() là-dessus. Mais je ne plaisante pas avec ça jusqu'à ce que je sois très confiant avec Django.

BTW: La plupart du code de cette page est erroné; par exemple, la variable user n'est pas utilisée du tout sur le snipplet de l'OP.

Questions connexes