2009-03-28 10 views
1

Comment ajouter un champ personnalisé de façon dynamique? Je suis en train, mais le champ ne sera pas insérer dans la base de données quand je synchroniser db:Comment dynamique ajouter un champ personnalisé au modèle

#It use as register(MyModel) 
def register(model, attr="my_attr"): 

    if model in registry: 
     raise AlreadyRegistered(
      _('The model %s has already been registered.') % model.__name__) 

    registry.append(model) 
    setattr(model, attr, MyField()) 

    MyField().contribute_to_class(model, attr) 

#MyField.contribute_to_class 
def contribute_to_class(self, cls, name): 
    super(MyField, self).contribute_to_class(cls, name) 

    setattr(cls, self.name, self) 
    cls.add_to_class('%s_manager' % name, MyDescriptor()) 

    signals.post_save.connect(self._save, cls, True) 
+0

** Vous pouvez être intéressé par ce guide: ** http://stackoverflow.com/q/7933596/497056 –

Répondre

3

Vous ne pouvez probablement pas faire cela sans le piratage dans les parties internes de Django. La commande syncdb inspecte l'objet méta pour chaque modèle pour obtenir une liste de champs pour créer, qui est créé sur le temps de construction de classe via le méta-classe de la classe de base django.db.models.Model:

class MyModel(models.Model): 
    my_filed = models.CharField(...) 

# Here, class construction is complete and your class has a _meta member. 
# If you want, you can check it out in the interactive shell. 
meta = MyModel._meta 

Après la construction de la classe est terminée, par exemple après le DEDENT suivant l'instruction class, le méta-objet est réparé (pas affecté par la modification de la classe du modèle) et vous devrez pirater le méta (ce qui est bien sûr possible) afin d'ajouter des champs dynamiques. Mais puisque vous jouez ici avec des objets internes, cela pourrait rendre votre application incompatible avec les futures versions de Django.

La question restante est: Pourquoi voudriez-vous faire cela? Étant donné que les tables de base de données ne sont généralement créées qu'une seule fois lors du déploiement de votre application, les modèles sont en quelque sorte «statiques».

+0

+1 pour référencer la métaclasse django. Il est possible d'écrire sa propre métaclasse de modèle, en tant que sous-classe de la métaclasse modèle de django, pour faire ceci ... en fait, c'était le moyen de contourner le manque d'héritage du modèle dans le passé. Maintenant, nous avons l'héritage vrai modèle, c'est probablement un meilleur moyen. –

0

Je cherchais la même chose et j'ai dû me contenter de SQL brut. Bien que vous pouvez utiliser quelque chose comme SQLAlchemy.

Questions connexes