如何在Django中实现单表单提交数据同时插入多张MySQL数据表
实现方案
前置准备
先确保你已经根据三张表的结构创建了对应的Django Model类,字段类型、约束和数据库表完全对齐,如果表之间有外键关联,也需要在Model里提前定义好关联关系。
核心实现逻辑
用Django自带的数据库事务保证三张表的插入操作原子性:要么全部插入成功,要么全部回滚,避免出现部分表有数据、部分表没数据的不一致情况。
代码示例
- 首先编写表单类(示例用ModelForm,你也可以用普通Form自定义字段):
# forms.py from django import forms from .models import Encours class ProductSubmitForm(forms.ModelForm): class Meta: model = Encours # 这里写你前端表单里需要用户填写的字段 fields = ['product_id', '其他需要用户输入的字段名']
- 编写视图处理逻辑:
# views.py from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.db import transaction from .forms import ProductSubmitForm from .models import Encours, OF, Poste @login_required # 保证只有登录用户可以访问 def submit_product(request): if request.method == "POST": form = ProductSubmitForm(request.POST) if form.is_valid(): form_data = form.cleaned_data try: # 开启原子事务 with transaction.atomic(): # 先插入被其他表关联的表,比如encours是OF的外键关联表,就先创建encours实例 encours_instance = Encours.objects.create( product_id = form_data['product_id'], create_user = request.user, # 其他字段对应赋值即可 ) # 插入OF表,需要关联encours的话直接传上面创建的实例 of_instance = OF.objects.create( product_id = form_data['product_id'], encours = encours_instance, # 其他字段对应赋值 ) # 插入Poste表,需要关联OF的话传上面的of_instance Poste.objects.create( product_id = form_data['product_id'], of = of_instance, # 其他字段对应赋值 ) # 全部插入成功,跳转成功页或者返回提示 return redirect("submit_success") except Exception as e: # 插入失败,把错误信息返回给前端 form.add_error(None, f"保存失败:{str(e)}") else: form = ProductSubmitForm() return render(request, "你的表单页模板路径.html", {"form": form})
注意事项
- 如果表之间没有外键关联,三个表的创建顺序没有要求,只要放在事务块里就行。
- 可以根据业务需要自行添加表单校验规则,比如产品编号格式校验、重复提交校验等。
- 如果你用的是Django类视图,把事务处理逻辑放到
form_valid方法里即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者ملاك العلج
相关产品推荐
相关产品推荐

