Django同一模型保存两个实例问题:treasury转账业务字段存储异常求助
问题根源
- 两个表单均配置了全字段读取,提交时会读取同一份POST参数,因此两条记录的treasury字段取值完全一致
- 未配置字段同步逻辑,两个表单独立保存,无法实现自动填充、借贷字段互换的需求
代码修改方案
1. 调整表单定义
第二个表单仅保留需要用户手动选择的目标资金库字段,其余字段不需要暴露给用户输入:
class TreasuryItem1Form(ModelForm): class Meta: model = TreasuryItem fields = ["treasury", "date", "name", "debit", "credit"] # 仅需填写目标资金库 class TreasuryItem2Form(ModelForm): class Meta: model = TreasuryItem fields = ["treasury"]
2. 修改视图逻辑
不直接独立保存两个表单,先保存第一条转出记录,再基于第一条记录构造第二条转入记录,自动同步字段、互换借贷值:
from django.db import transaction from django.shortcuts import render, redirect def TreasuryItem_Create(request, pk): treasurys = Treasury.objects.all() treasury = treasurys.get(id=pk) form1 = TreasuryItem1Form() form2 = TreasuryItem2Form() if request.method == 'POST': form1 = TreasuryItem1Form(request.POST) form2 = TreasuryItem2Form(request.POST) if form1.is_valid() and form2.is_valid(): # 加事务保证两条记录要么同时成功要么同时失败,避免数据不一致 with transaction.atomic(): # 保存第一条转出记录 item1 = form1.save() # 构造第二条转入记录 item2 = TreasuryItem() # 取用户选择的目标资金库 item2.treasury = form2.cleaned_data['treasury'] # 同步基础字段 item2.name = item1.name item2.date = item1.date # 互换借贷值 item2.debit = item1.credit item2.credit = item1.debit item2.save() return redirect('treasury_profile', pk) # 渲染表单到模板,替换为你实际的模板文件路径 return render(request, 'treasury_item_create.html', {'form1': form1, 'form2': form2, 'treasury': treasury})
可选优化
- 增加合法性校验:判断两个表单选择的treasury不能为同一个,避免生成自己转自己的无效记录
- 可在TreasuryItem模型中增加关联字段,将同一次转账的两条记录绑定,方便后续对账查询
内容的提问来源于stack exchange,提问作者youssefmohamed
相关产品推荐
相关产品推荐

