Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
当前回答
如果你有一个OneToOneField,那么你应该这样做:
tmp = Foo.objects.get(pk=1)
tmp.pk = None
tmp.id = None
instance = tmp
其他回答
这里要小心。如果您处于某种类型的循环中,并且逐个检索对象,那么这可能会非常昂贵。如果你不想调用数据库,只需执行:
from copy import deepcopy
new_instance = deepcopy(object_you_want_copied)
new_instance.id = None
new_instance.save()
它做的事情与其他一些答案相同,但它不进行数据库调用来检索对象。如果您想要复制数据库中还不存在的对象,这也很有用。
设置pk为None更好,因为Django可以正确地为你创建一个pk
object_copy = MyObject.objects.get(pk=...)
object_copy.pk = None
object_copy.save()
有一个包可以做到这一点,它可以在django管理站点中创建一个UI: https://github.com/RealGeeks/django-modelclone
pip install django-modelclone
将“modelclone”添加到INSTALLED_APPS中,并在admin.py中导入它。
然后,每当您想要使模型可克隆时,只需替换“admin”即可。在给定的管理模型类“modelclone.ClonableModelAdmin”中。这将导致在给定模型的实例详细信息页面中出现“Duplicate”按钮。
试试这个
original_object = Foo.objects.get(pk="foo")
v = vars(original_object)
v.pop("pk")
new_object = Foo(**v)
new_object.save()
如何做到这一点被添加到Django官方文档在Django1.4
https://docs.djangoproject.com/en/1.10/topics/db/queries/#copying-model-instances
官方的答案与miah的答案相似,但是文档指出了继承和相关对象的一些困难,所以您应该确保阅读了文档。