Foo.objects.get(pk="foo")
<Foo: test>

在数据库中,我想添加另一个对象,这是上面对象的副本。

假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?


当前回答

设置pk为None更好,因为Django可以正确地为你创建一个pk

object_copy = MyObject.objects.get(pk=...)
object_copy.pk = None
object_copy.save()

其他回答

如何做到这一点被添加到Django官方文档在Django1.4

https://docs.djangoproject.com/en/1.10/topics/db/queries/#copying-model-instances

官方的答案与miah的答案相似,但是文档指出了继承和相关对象的一些困难,所以您应该确保阅读了文档。

这是克隆模型实例的另一种方式:

d = Foo.objects.filter(pk=1).values().first()   
d.update({'id': None})
duplicate = Foo.objects.create(**d)

设置pk为None更好,因为Django可以正确地为你创建一个pk

object_copy = MyObject.objects.get(pk=...)
object_copy.pk = None
object_copy.save()

只需更改对象的主键并运行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

试试这个

original_object = Foo.objects.get(pk="foo")
v = vars(original_object)
v.pop("pk")
new_object = Foo(**v)
new_object.save()