Eri*_*ric 7 python django django-models
当我克隆一个django模型实例时,我习惯于清理'pk'字段.这似乎不适用于继承的模型:
拿着这个 :
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)
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个实例并按照"通常"的方式克隆它(我使用的是django shell):
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 !)
Run Code Online (Sandbox Code Playgroud)
我发现的唯一方法是:
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>]
Run Code Online (Sandbox Code Playgroud)
我觉得非常难看,是否有更好的方法从继承的模型克隆实例?
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.
Run Code Online (Sandbox Code Playgroud)
所以 c 永远是同一个对象。如果你想克隆它,你需要生成一个新的对象。使用 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__()
Run Code Online (Sandbox Code Playgroud)
所以你可以走了
c2=ModelC(c)
Run Code Online (Sandbox Code Playgroud)
或者直接调用它:
c2=ModelC(c.info1, c.info2, c.info3)
Run Code Online (Sandbox Code Playgroud)
那么 c2 和 c 将是相同的,尽管它们的 pk 不同
| 归档时间: |
|
| 查看次数: |
1281 次 |
| 最近记录: |