You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:00:03