Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
当前回答
这里要小心。如果您处于某种类型的循环中,并且逐个检索对象,那么这可能会非常昂贵。如果你不想调用数据库,只需执行:
from copy import deepcopy
new_instance = deepcopy(object_you_want_copied)
new_instance.id = None
new_instance.save()
它做的事情与其他一些答案相同,但它不进行数据库调用来检索对象。如果您想要复制数据库中还不存在的对象,这也很有用。
其他回答
这将在内存中进行复制,您可以独立地进行突变。
original = CheckoutItem(title="test", ...)
copy = CheckoutItem()
for f in CheckoutItem._meta.fields:
setattr(copy, f.attname, getattr(original, f.attname))
或者,作为一种方法:
def clone(self):
"""Returns a clone of this instance."""
clone = self.__class__()
for f in self.__class__._meta.fields:
setattr(clone, f.attname, getattr(self, f.attname))
return clone
这里有一个克隆片段,你可以添加到你的模型,它是这样的:
def clone(self):
new_kwargs = dict([(fld.name, getattr(old, fld.name)) for fld in old._meta.fields if fld.name != old._meta.pk]);
return self.__class__.objects.create(**new_kwargs)
有一个包可以做到这一点,它可以在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
这个简单的过程对我来说很有效:
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()