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

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

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


当前回答

如果你有一个OneToOneField,那么你应该这样做:

    tmp = Foo.objects.get(pk=1)
    tmp.pk = None
    tmp.id = None
    instance = tmp

其他回答

克隆具有多个继承级别的模型,即>= 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)

请参考这里的问题。

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

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()

如果你有一个OneToOneField,那么你应该这样做:

    tmp = Foo.objects.get(pk=1)
    tmp.pk = None
    tmp.id = None
    instance = tmp

试试这个

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