2012-04-30 1 views
4

Je me demande s'il est possible de remplacer la valeur par défaut d'un champ lorsqu'il est retourné. Dire que j'avais un modèle:Modèles Django: Remplacer une valeur de retour de champ

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

Est-il possible que l'appel

modela_instance.name 

peut retourner une valeur modifiée, par exemple le nom + « foo », mais ont le code qui ajoute foo géré par défaut dans le modèle lui-même, tout ce que je devrais faire est d'appeler le nom pour obtenir la valeur ajoutée?

j'élaborer et dire que ce que j'espère vraiment faire est d'avoir une méthode dans le modèle:

def get_name(self): 
    return self.name + " foo" 

ou similaire, et juste veulent que la méthode de get_name pour passer outre l'appel au champ " prénom".

Répondre

10

Oui, vous pouvez utiliser properties pour faire

class ModelA(models.Model) 
    _name = models.CharField(...) 

    def set_name(self, val): 
     self._name = "%s - foo" % val 

    def get_name(self): 
     return self._name 

    name = property(get_name, set_name) 
+0

Merci, j'ai fini par utiliser une méthode légèrement différente, maintenant j'utilise une propriété en lecture seule qui renvoie ma méthode au lieu du champ de nom lui-même. – PT114

+0

Voir aussi http://stackoverflow.com/questions/3757951/changing-the-behaviour-of-a-django-model-with-getattr. Fondamentalement, soit utiliser les propriétés ou '__getattr__' (avec précaution!). –

1

Pourquoi voudriez-vous faire cela? Je ne sais pas, mais je ne pense pas que ce soit une bonne idée .. Cependant, vous pouvez par exemple utiliser la méthode unicode:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : foo" % self.name 

et lorsque vous appelez utilisez simplement:

modela_instance

ou lorsque foo doit être dynamique:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : %s" % (self.name, self.make_foo()) 

    def make_foo(self): 
     return "foo" 

ou définir votre propre méthode:

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def alt_name(self): 
     return "%s : foo" % self.name 
+0

Le nom de mon modèle est constitué d'une chaîne contenant des "tags" tels que {ModelB: description}. Les balises se rapportent à des attributs d'un modèle différent. Donc {ModelB: description} représente l'attribut de description d'un autre modèle "B". J'ai une méthode qui peut traduire ces balises, mais il y a beaucoup d'endroits où le nom est appelé et il serait impraticable d'aller les changer tous, et si l'attribut description de modelb contenu à ag de modelc, il ne serait pas traduit parce que le {ModelB: description} renvoie juste les étiquettes de chaîne de tout ce que la description de modelb tenait. – PT114

Questions connexes