我想知道做什么更好:
d = {'a': 1, 'b': 2}
'a' in d
True
Run Code Online (Sandbox Code Playgroud)
要么:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
Run Code Online (Sandbox Code Playgroud) 我想在Django模型上创建一个方法,调用它model.duplicate(),复制模型实例,包括指向它的所有外键.我知道你可以这样做:
def duplicate(self):
self.pk = None
self.save()
Run Code Online (Sandbox Code Playgroud)
...但是这样所有相关模型仍然指向旧实例.
我不能简单地保存对原始对象的引用,因为self在执行方法期间指向更改的内容:
def duplicate(self):
original = self
self.pk = None
self.save()
assert original is not self # fails
Run Code Online (Sandbox Code Playgroud)
我可以尝试保存对相关对象的引用:
def duplicate(self):
original_fkeys = self.fkeys.all()
self.pk = None
self.save()
self.fkeys.add(*original_fkeys)
Run Code Online (Sandbox Code Playgroud)
...但是这会将它们从原始记录转移到新记录.我需要将它们复制并指向新记录.
其他地方的几个答案(在此之前我更新了问题)建议使用Python copy,我怀疑它适用于此模型上的外键,但不适用于指向它的另一个模型上的外键.
def duplicate(self):
new_model = copy.deepcopy(self)
new_model.pk = None
new_model.save()
Run Code Online (Sandbox Code Playgroud)
如果你这样做new_model.fkeys.all()(到目前为止遵循我的命名方案)将是空的.