2010-03-04 8 views
0

Est-il possible d'instancier un modèle sous-classé à partir de son parent?Instancier le modèle django à partir des données parent

class Object1(models.Model): 
    field1a = models.CharField() 
    field1b = models.CharField() 
    feild1c = models.ForeignKey(Object4)  

class Object2(Object1): 
    field3 = models.CharField() 

class Object3(Object1): 
    field3 = models.CharField() 

class Object4(models.Model): 
    field4 = models.CharField() 

Ce que je veux faire est de créer la classe de base d'abord, puis sur la base d'une règle instancier une des sous-classes, mais en utilisant la classe de base déjà créé.

Quelque chose comme:

obj4 = Object4(field4='d') 
obj1 = Object1(field1a='a', field1b='b', field1c=obj4) 
if somerule: 
    obj2 = Object2(object1_ptr=obj1, field2='2') 
else: 
    obj3 = Object3(object1_ptr=obj1, field3='3') 

Je ne veux pas répéter les champs Object1 dans les cas/clauses d'autre. Est-il possible d'accomplir cela? Quand j'essaye ceci je reçois une erreur de clé étrangère; Impossible d'ajouter ou mettre à jour une ligne enfant: Une contrainte de clé étrangère échoue

Répondre

0

Je recommande de faire quelque chose comme ceci:

attr = dict(field1a='a', field1b='b', field1c=obj4) 
obj1 = Object1(**attr) 
if somerule: 
    attr["field2"] = 2 
    obj2 = Object2(**attr) 
else: 
    attr["field3"]='3' 
    obj3 = Object3(**attr) 

Soyez conscient que le dictionnaire attr changements en place.

+0

Merci. Je vais le donner et voir si ça fait ce que je veux. –

0

Ce que vous faites est presque correct, mais si vous voulez le copier, vous devrez supprimer la clé primaire. Notez cependant que si un autre modèle référence votre modèle avec une clé étrangère, il fait référence à obj1, pas à obj2. Et obj1 sera, bien sûr, toujours exister.

+0

Je ne vois pas comment Object2 (object1_ptr = obj1, peut être presque correct.Et où voulez-vous insérer un del obj2.id? – stefanw

+0

Je suppose que 'obj1' existe déjà dans la base de données, même si cela peut être incorrect Bien sûr, si vous voyez votre réponse, il semble que j'ai peut-être mal interprété la question: Le point reste cependant le même, si l'objet existe déjà dans la base de données, vous aurez besoin pour supprimer la clé primaire pour Django pour la réinsérer – Wolph

+0

Merci pour les réponses Je n'utilise actuellement que des instructions if/else pour gérer cela et créer chaque objet en fonction du résultat de la règle, tout ce que je voulais éviter était de dupliquer le code pour créer les objets, mon exemple est petit mais les objets réels ont un plus grand nombre de fie lds. L'ajout/modification sauvegarde/suppression est une autre question que je traite de manière similaire à vos suggestions. Merci encore. –