Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
Foo.objects.get(pk="foo")
<Foo: test>
在数据库中,我想添加另一个对象,这是上面对象的副本。
假设我的表只有一行。我想将第一行对象插入到另一行,使用不同的主键。我该怎么做呢?
当前回答
试试这个
original_object = Foo.objects.get(pk="foo")
v = vars(original_object)
v.pop("pk")
new_object = Foo(**v)
new_object.save()
其他回答
克隆具有多个继承级别的模型,即>= 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)
请参考这里的问题。
如何做到这一点被添加到Django官方文档在Django1.4
https://docs.djangoproject.com/en/1.10/topics/db/queries/#copying-model-instances
官方的答案与miah的答案相似,但是文档指出了继承和相关对象的一些困难,所以您应该确保阅读了文档。
这将在内存中进行复制,您可以独立地进行突变。
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
这是克隆模型实例的另一种方式:
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()