2010-06-15 6 views
3

Howdy - aujourd'hui un problème bizarre survenu à moi:classe modèle Django et propriété personnalisée

J'ai une classe modle dans Django et ajouté une propriété personnalisée à ce que ne doit pas être enregistré dans la base de données et est donc représente pas dans la structure des modèles:

class Category(models.Model): 
    groups = models.ManyToManyField(Group) 
    title = defaultdict() 

maintenant, quand je suis dans la coquille ou d'écrire un test et je fais ce qui suit:

c1 = Category.objects.create() 
c1.title['de'] = 'german title' 
print c1.title['de'] # prints "german title" 

c2 = Category.objects.create() 
print c2.title['de'] # prints "german title" <-- WTF? 

Il semble que « titre » est une sorte de monde. Si je change de titre pour une chaîne simple, cela fonctionne comme prévu, donc il doit faire quelque chose avec le dict? J'ai également essayé de définir le titre comme une propriété:

title = property(_title) 

Mais cela n'a pas fonctionné, aussi. Alors, comment puis-je résoudre cela? Merci d'avance!

EDIT:

est ici l'intention du problème de base pour vous fournir un meilleur regard sur l'ensemble entourant la demande enviroment: Dans notre structure de modèle que nous avons une classe de modèle qui stocke les traductions. Cette classe est indépendante de toutes les autres classes qui ont des relations entre elles. La classe de traduction stocke la valeur traduite, une clé de langue, une clé de traduction et le paquet et la classe à laquelle appartient la traduction. Certaines classes de modèle peuvent avoir des propriétés qui peuvent être traduites dans différentes langues. Ces propriétés ne sont pas mappées dans la structure du modèle django car ce n'est pas vraiment possible à nos yeux. Chacune de ces classes avec des propriétés traduisibles, appelons-les translatables, peut avoir une ou plusieurs de ces propriétés. C'est la clé de la traduction. Par exemple. S'il existe une catégorie de classe avec un "titre" de propriété traduisible, la traduction du modèle stockera "module.somewhere.Category" comme package/class, "title" comme clé de traduction, et par ex. pour l'allemand, la valeur de traduction "Kategorie" et la clé de langue "de". Mon but est de faciliter l'accès à ces propriétés. Donc, toutes ces classes de modèles héritent d'une classe simple appelée "Translatable". Il a une méthode pour résoudre le chemin du module et le nom de la classe (pour le stockage ultérieur dans la table de base de données de traduction) et une méthode "_propertize" qui prend le nom de la propriété. Propertize instancie une classe "Translator" unique pour chaque nom de propriété traduisible. Cette classe fait la résolution de la valeur de traduction réelle de la classe de modèle de traduction et quelques trucs pour résoudre automatiquement la traduction de la langue actuellement choisie.

Répondre

6

Ne le faites pas comme ça. Votre attribut title est complètement "global". Cela fait partie de la classe et non de chaque instance.

Faites quelque chose comme ceci.

class Category(models.Model): 
    groups = models.ManyToManyField(Group) 
    @property 
    def title(self): 
     return self._title 
    def save(self, *args, **kw ): 
     try: 
      self._title 
     except AttributeError: 
      self._title= defaultdict() 
     super(Category, self).save(*args, **kw) 

Si vous pouvez définir votre cas réel utilisation, il pourrait être possible de simplifier beaucoup.

+0

Eh bien merci, cela rend la chose plus claire pour moi. Mais comment définir self._title dans votre exemple? Mon cas d'utilisation réel est un peu étrange, j'ai des classes de modèles qui ont des propriétés traduisibles en principe. Ces accessoires que vous ne pouvez pas mettre directement dans le modèle, car il peut y avoir par exemple dans la catégorie Catégorie le titre du champ dans 6 langues différentes. Une classe peut également avoir plus d'une de ces propriétés traduisibles. Nous avons créé une classe Translatable chaque modelclass hérite de (et aussi de models.Model) qui a une méthode avec un dict lié à la propriété. – dArignac

+0

@dArignac: Vous ne "définissez" rien. moi-même._title' enregistre le dictionnaire par défaut dans l'instance. Rien n'est "défini" en Python. Le champ "définitions" dans Django construit les attributs et les méthodes secrètement quand la classe est construite. –

+0

@dArignac: "Mon cas d'utilisation actuel est un peu bizarre ..." Veuillez METTRE à jour la question avec votre cas d'utilisation réel. S'il vous plaît inclure ** détails **, s'il vous plaît être ** spécifique ** et s'il vous plaît mettre à jour la question. –

Questions connexes