复制Django对象并保留model_set项

时间:2017-06-22 16:30:31

标签: django django-models

在我的项目中,我有2个模型:

class Product(models.Model):
    name = models.CharField(max_length=200)

class Material(models.Model):
    name = models.CharField(max_length=200)
    product = models.ForeignKey(Product)

现在,我想复制一份产品并保留所有指定的材料。 这就是我试过的:

new_product = Product.object.get(pk='someexistingpk')
new_product.pk = None
new_product.name += ' (Copy)'
new_product.save()

我尝试的另一种变体:

new_product = deepcopy(Product.object.get(pk='someexistingpk'))
new_product.pk = None
new_product.name += ' (Copy)'
new_product.save()

但在这两种情况下,生成的model_set都是空的。没有附加的项目被保留。

new_product.material_set.all()
<QuerySet []>

我该如何解决这个问题?理想情况下,不会迭代原始material_set中的每个项目。

2 个答案:

答案 0 :(得分:0)

鉴于ForeignKeys不能有多个赋值,只有它们不会被复制才有意义,因为这会破坏原始对象。

因此,在复制产品时,也应对相关对象执行相同操作。像这样:

new_prod = deepcopy(prod)
new_prod.pk = None
new_prod.save()

for mat in prod.material_set.all():
    new_mat = deepcopy(mat)
    new_mat.pk = None
    new_mat.product = new_prod
    new_mat.save()

现在,它会产生一个很好的Queryset,其中包含所有附加的材质对象。

new_prod.material_set.all()
<QuerySet [<Material: 1.01 Katoen cats and dogs>, <Material: 1.0 Hour-cost>, <Material: 2.0 lint>, <Material: 1.0 Katoen cats and dogs>]>

答案 1 :(得分:0)

根据我的理解,您正在尝试复制模型。我在项目中解决这个问题的方法是使用动态模型和继承。如果使用继承,则所有字段将自动复制到新模型。

from MyApp.models import Product
class Meta:
    pass
setattr(Meta, 'app_label', 'MyApp')
attrs = {'__module__': module, 'Meta': Meta}
model = type('ProductCopy', (Product,), attrs)

所以这里创建的新模型称为ProductCopy,并在Django Admin页面上有一个表。 要了解有关动态模型的更多信息,您可以查看此documentation