在我的项目中,我有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中的每个项目。
答案 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。