1
deals_formset_factory = modelformset_factory(Deal, form=DealCForm, extra=1)    
attached_deals_formset = deals_formset_factory(request.POST, prefix='deals')

由于我的Deal模型的某些字段未显示在表单中,因此无法由用户设置(但 M2M 字段已显示并且可以由用户设置),我不能只做一个

for fm in attached_deals_formset:                
    if fm.has_changed(): 
       fm.save()

因为它会破裂。

所以理论上这种情况下的想法是做

deal = fm.save(commit=False)
...
deal.save()

但这并不能在交易中保存我的 M2M 字段。直通表保持不变。解决这个问题的最佳方法是什么?

class Deal(models.Model):            
    deal_id             = UUIDField()
    ....
    sales_item          = models.ManyToManyField(SalesItem)    
4

1 回答 1

3

我找到了解决方案,无需重写保存方法。

当您的模型与另一个模型具有多对多关系时,会看到使用 commit=False 的另一个副作用。如果您的模型具有多对多关系并且您在保存表单时指定 commit=False,则 Django 无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。

为了解决这个问题,每次您使用 commit=False 保存表单时,Django 都会向您的 ModelForm 子类添加一个 save_m2m() 方法。手动保存表单生成的实例后,可以调用 save_m2m() 保存多对多表单数据

资源

在 deal.save() 之后:

fm.save_m2m()
于 2012-09-19T10:15:14.993 回答