Django保存含formset元素的对象并复制生成新关联元素的实现问题
问题原因
第一次调用formset.save()后,formset中所有子表单对应的模型实例都会被标记为已存储(主键已赋值、_state.adding为False),此时即使修改formset绑定的父实例,第二次调用save()时Django ORM也只会尝试更新原有主键对应的记录,不会生成新的关联对象。
解决方案
你需要手动遍历formset中的有效子实例,清空主键后重新关联到新的父对象再保存,修正后的代码如下:
class SoumissionUpdateView(LoginRequiredMixin, SideBarMixin, UpdateView): def form_valid(self, form, formset): # 保存原父对象及原关联对象的修改 self.object = form.save() formset.instance = self.object formset.save() # 生成新的父对象副本 self.object.pk = None self.object.save() # 遍历处理所有有效子表单,生成新的关联对象副本 for sub_form in formset: # 跳过标记删除、为空的无效表单 if not sub_form.cleaned_data or sub_form.cleaned_data.get('DELETE', False): continue sub_instance = sub_form.instance # 清空主键强制ORM生成新记录 sub_instance.pk = None # 替换为你子模型中指向Soumission的外键字段名 sub_instance.soumission = self.object sub_instance.save() return HttpResponseRedirect(self.get_success_url())
补充说明
如果你的子模型存在唯一约束字段、或者嵌套了其他关联对象,需要对应清空唯一字段值、复制嵌套关联对象,避免保存时出现唯一索引冲突或者关联关系错误。
内容的提问来源于stack exchange,提问作者logicOnAbstractions
相关产品推荐
相关产品推荐

