如何克隆Django模型实例对象并将其保存到数据库中?
如何克隆Django模型实例对象并将其保存到数据库中?
Foo.objects.get(pk="foo")
在数据库中,我想添加另一个对象,它是上面对象的副本。
假设我的表只有一行。我想把第一行对象插入到另一行中,使用不同的主键。怎么做呢?
admin 更改状态以发布 2023年5月21日
Django数据库查询的文档包括有关复制模型实例的部分。假设您的主键是自动生成的,您可以获取要复制的对象,将主键设置为None
,然后再次保存该对象:
\n
blog = Blog(name='My blog', tagline='Blogging is easy') blog.save() # blog.pk == 1 blog.pk = None blog.save() # blog.pk == 2
\n在此片段中,第一个save()
创建了原始对象,第二个save()
创建了副本。
\n如果您继续阅读文档,还有关于如何处理两种更复杂情况的示例:(1)复制一个是模型子类的对象,以及(2)复制相关对象,包括多对多关系中的对象。
\n
\n关于miah的答案的说明:在miah的答案中提到了将pk设置为None
,尽管它不是显眼的。因此,我的答案主要强调这种方法是Django推荐的方法。
\n历史注释:在Django文档版本1.4之前没有解释这一点。但在1.4之前就已经可以实现了。
\n可能的未来功能:前面提到的文档更改是在此票务中进行的。在票务的评论线程中,还讨论了添加模型类的内置copy
函数的问题,但就我所知,他们决定暂时不解决这个问题。因此,目前这种“手动”复制的方法可能是唯一的选择。