Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
当前回答
有一个包可以做到这一点,它可以在django管理站点中创建一个UI: https://github.com/RealGeeks/django-modelclone
pip install django-modelclone
将“modelclone”添加到INSTALLED_APPS中,并在admin.py中导入它。
然后,每当您想要使模型可克隆时,只需替换“admin”即可。在给定的管理模型类“modelclone.ClonableModelAdmin”中。这将导致在给定模型的实例详细信息页面中出现“Duplicate”按钮。
其他回答
这里要小心。如果您处于某种类型的循环中,并且逐个检索对象,那么这可能会非常昂贵。如果你不想调用数据库,只需执行:
from copy import deepcopy
new_instance = deepcopy(object_you_want_copied)
new_instance.id = None
new_instance.save()
它做的事情与其他一些答案相同,但它不进行数据库调用来检索对象。如果您想要复制数据库中还不存在的对象,这也很有用。
Django数据库查询文档中有一节是关于复制模型实例的。假设你的主键是自动生成的,你得到你想要复制的对象,设置主键为None,并再次保存对象:
blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1
blog.pk = None
blog.save() # blog.pk == 2
在这段代码中,第一个save()创建原始对象,第二个save()创建副本。
如果你继续阅读文档,还有关于如何处理两种更复杂情况的示例:(1)复制作为模型子类实例的对象,以及(2)复制相关对象,包括多对多关系的对象。
注意miah的回答:在miah的回答中提到了将pk设置为None,尽管它没有显示在前面和中心。所以我的回答主要是为了强调这个方法是django推荐的方法。
历史提示:Django文档直到1.4版才解释了这一点。不过,在1.4之前就已经实现了。
未来可能的功能:前述的文档更改是在此票据中进行的。在ticket的评论线程中,也有一些关于为模型类添加内置复制功能的讨论,但据我所知,他们决定暂时不解决这个问题。所以这种“手动”的复制方式现在可能只能用了。
克隆具有多个继承级别的模型,即>= 2,或ModelC以下
class ModelA(models.Model):
info1 = models.CharField(max_length=64)
class ModelB(ModelA):
info2 = models.CharField(max_length=64)
class ModelC(ModelB):
info3 = models.CharField(max_length=64)
请参考这里的问题。
有一个包可以做到这一点,它可以在django管理站点中创建一个UI: https://github.com/RealGeeks/django-modelclone
pip install django-modelclone
将“modelclone”添加到INSTALLED_APPS中,并在admin.py中导入它。
然后,每当您想要使模型可克隆时,只需替换“admin”即可。在给定的管理模型类“modelclone.ClonableModelAdmin”中。这将导致在给定模型的实例详细信息页面中出现“Duplicate”按钮。
只需更改对象的主键并运行save()。
obj = Foo.objects.get(pk=<some_existing_pk>)
obj.pk = None
obj.save()
如果需要自动生成密钥,请将新密钥设置为None。
更多关于更新/插入的信息请点击这里。
关于复制模型实例的官方文档:https://docs.djangoproject.com/en/2.2/topics/db/queries/#copying-model-instances