【发布时间】:2015-11-20 23:40:36
【问题描述】:
我想在 Django 模型上创建一个方法,称为 model.duplicate(),它复制模型实例,包括指向它的所有外键。我知道你可以这样做:
def duplicate(self):
self.pk = None
self.save()
...但是这样所有相关模型仍然指向旧实例。
我不能简单地保存对原始对象的引用,因为self 指向的内容在方法执行期间发生了变化:
def duplicate(self):
original = self
self.pk = None
self.save()
assert original is not self # fails
我可以尝试只保存对相关对象的引用:
def duplicate(self):
original_fkeys = self.fkeys.all()
self.pk = None
self.save()
self.fkeys.add(*original_fkeys)
...但这会将它们从原始记录转移到新记录。我需要将它们复制过来并指向新记录。
其他地方的几个答案(在我更新问题之前在这里)建议使用 Python 的 copy,我怀疑它适用于外键在这个模型上,但不是另一个模型上指向的外键它。
def duplicate(self):
new_model = copy.deepcopy(self)
new_model.pk = None
new_model.save()
如果你这样做new_model.fkeys.all()(按照我迄今为止的命名方案)将是空的。
【问题讨论】:
标签: python django python-2.7