我想在Django模型上创建一个方法,称之为model.duplicate()
,它复制模型实例,包括指向它的所有外键。我知道你可以做到:
def duplicate(self):
self.pk = None
self.save()
……但这样一来,所有相关模型仍然指向旧实例。在
我不能简单地保存对原始对象的引用,因为self
在方法执行期间所指的更改:
我可以尝试保存对相关对象的引用:
def duplicate(self):
original_fkeys = self.fkeys.all()
self.pk = None
self.save()
self.fkeys.add(*original_fkeys)
…但这会将它们从原始记录转移到新记录。我要把它们抄过来,指着新唱片。在
其他地方的一些答案(在我更新问题之前)建议使用Python的^{
def duplicate(self):
new_model = copy.deepcopy(self)
new_model.pk = None
new_model.save()
如果您这样做,new_model.fkeys.all()
(按照我目前的命名方案)将是空的。在
虽然我接受了另一个发帖人的回答(因为它帮助我到达了这里),但我还是想把我最终得到的解决方案贴出来,以防它能帮助其他陷入同样困境的人。在
使用时的外观:
^{pr2}$为了保护无辜的人,模特和相关模特的名字都改了。在
您可以创建新实例并按如下方式保存它
我不确定它在很多领域会有什么表现。但对于简单的字段,它是有效的。对于新实例,您总是可以弹出您不感兴趣的字段。在
我迭代_元字段可以用copy完成,但重要的是使用新的
id
作为foreign_key_field
。在我确信通过编程可以检测出哪些字段是
self.__class__
(foreign_key_field
)的外键,但是由于可以有更多的字段,最好显式地命名一个(或多个)。在我在Django 2.1/python3.6中尝试了其他答案,但它们似乎没有复制一对多和多对多相关对象(
self._meta.fields
不包含一对多相关字段,但self._meta.get_fields()
有)。另外,其他答案要求事先知道相关字段名或要复制哪些外键。在我编写了一种更通用的方法来实现这一点,处理一对多和多对多相关字段。包括评论,欢迎提出建议:
相关问题 更多 >
编程相关推荐