为何在克隆时更改原始django对象?

时间:2019-05-23 00:12:09

标签: python django

我想克隆一个Django模型/对象。这是我的代码,其中包含一些调试语句(方法位于Item类中)

def duplicate_item(self):
    print("original",self.id)
    copy = self
    copy.id = uuid.uuid4()
    print("copy",copy.id)
    copy.save()
    print("What happened",self.id)


这是输出:

original 6a5a8d54-5b45-47fd-abf3-4357aa89dd0c
copy 5b6bfb5f-36b2-4a74-968e-c1f007df9056
what happened 5b6bfb5f-36b2-4a74-968e-c1f007df9056

为什么会这样?我对python浅/深复制逻辑了解不足,因此可能与它有关。谢谢

1 个答案:

答案 0 :(得分:0)

正如@selcuk所说,在这里“您没有克隆任何东西” 。您可以使用此方法克隆对象。

  

注意:如果您的主键是pk

,则可以将此id更改为id
def duplicate_item(self):
    old_data = self.__dict__

    if 'pk' in old_data:
        del old_data['pk']

    if '_state' in old_data:
        del old_data['_state']

    new_object = self.__class__.objects.create(**old_data)
    return new_object

但是您也可以使用pk/id

来修改uuid.uuid4()
def duplicate_item(self):
    old_data = self.__dict__
    old_data['pk'] = uuid.uuid4() # new id

    if '_state' in old_data:
        del old_data['_state']

    new_object = self.__class__.objects.create(**old_data)
    return new_object