2013-04-09 20 views
5

私はdjangoモデルインスタンスをクローンするとき、私は 'pk'フィールドをきれいにしました。 これは、継承されたモデルでは動作しないようです。今、(私はDjangoのシェルを使用しています)のインスタンスを作成し、「通常の」方法でそれを複製してみましょう継承されたdjangoモデルインスタンスをクローン化

class ModelA(models.Model): 
    info1 = models.CharField(max_length=64) 

class ModelB(ModelA): 
    info2 = models.CharField(max_length=64) 

class ModelC(ModelB): 
    info3 = models.CharField(max_length=64) 

これを取る

私が見つけた唯一の方法が何をした

In [1]: c=ModelC(info1="aaa",info2="bbb",info3="ccc") 

In [2]: c.save() 

In [3]: c.pk 
Out[3]: 1L 

In [4]: c.pk=None <------ to clone 

In [5]: c.save() <------ should generate a new instance with a new index key 

In [6]: c.pk  
Out[6]: 1L   <------ but don't 

In [7]: ModelC.objects.all() 
Out[7]: [<ModelC: ModelC object>] (only one instance !) 

In [16]: c.pk =None 

In [17]: c.id=None 

In [21]: c.modela_ptr_id=None 

In [22]: c.modelb_ptr_id=None 

In [23]: c.save() 

In [24]: c.pk 
Out[24]: 2L <---- successful clone containing info1,info2,info3 from original instance 

In [25]: ModelC.objects.all() 
Out[25]: [<ModelC: ModelC object>, <ModelC: ModelC object>] 

私がいることを見つけます非常に醜いです、継承されたモデルからインスタンスを複製するより良い方法はありますか?

+0

基本モデルを単独で使用しますか、またはそれらから継承するモデルのみを使用しますか?基本モデルを単独で使用する必要がない場合は、[抽象基本クラス](https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base)を使用する必要があります。 -クラス)。 –

+0

実際にDjangoモデルの継承は悪い習慣とみなすことができます。抽象基本クラス、または外部キーを使用できます。 – PepperoniPizza

+0

save()メソッドを貼り付けてください.PKをモデルにどのように設定していますか? – PepperoniPizza

答えて

0
c=ModelC(info1="aaa",info2="bbb",info3="ccc") 
# creates an instance 

c.save() 
# writes instance to db 

c.pk=None 
# I doubt u can nullify the auto-generated pk of an existing object, because a pk is not nullable 
c.save() 
# if I'm right nothing will happen here. 

だから、常に同じオブジェクトになります。クローンを作成する場合は、新しいオブジェクトを生成する必要があります。 ModelC内のコンストラクタで、次のいずれか

def __init__(another_modelC_obj=null, self): 
    if another_modelC_obj: 
     # for every field in another_modelC_obj: do self.field = another_modelC_obj.field 
    super().__init__() 

ので、あなたは

c2=ModelC(c) 

それとも直接それを呼び出す行くことができます。そして、C2およびC

c2=ModelC(c.info1, c.info2, c.info3) 

を自分のPKのにもかかわらず、同じになります

関連する問題