如何克隆Django模型实例对象并保存到数据库?

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

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

假设我的表有一行。我想将第一行对象插入到具有不同主键的另一行中。我该怎么做?

15个回答

0

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

请参考这里的问题。

啊,是的,但那个问题没有被接受的答案!干得好! - Bobort

0

这个简单的过程对我来说很有效:

foo_obj = Foo.objects.get(pk="foo")
foo_values = foo_obj.__dict__
foo_values.pop('_state')
foo_values.pop('id')
foo_new_obj = Foo(**foo_values)
foo_new_obj.save()

除了这个解决方案,没有其他方法可以在覆盖该方法时获取相关的多对多关系。 - big-vl

0

有一个包可以做到这一点,它在Django管理站点内创建了一个UI:https://github.com/RealGeeks/django-modelclone

pip install django-modelclone

将 "modelclone" 添加到 INSTALLED_APPS 中,并在 admin.py 中导入它。
然后,每当您想要使模型可克隆时,只需在给定的管理员模型类“modelclone.ClonableModelAdmin”中替换“admin.ModelAdmin”。这会导致在该特定模型的实例详细信息页中出现一个“复制”按钮。

0

试试这个

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

将pk属性弹出有点毫无意义。将其设置为None更有意义。 - logicOnAbstractions

0
如果你有一个 OneToOneField,那么你应该这样做:
    tmp = Foo.objects.get(pk=1)
    tmp.pk = None
    tmp.id = None
    instance = tmp

你能详细说明为什么对于OneToOneField来说这是必要的吗?OneToOneField指的是哪个模型(即哪个模型指向哪个模型)? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接