Django:使用表单和内联表单集保存新 object(事务管理)
Django: Saving new object with form and inline formset (transaction managment)
我有一个表格,我在其中创建了一个新的 "parent" object,正好是一个 child object 类型 A 和 n child objects 类型 B(n 也可以为 0)。我用一个表单和两个内联表单集来做到这一点。
我已经在设置里设置了'ATOMIC_REQUESTS': True
。
我正在使用基于函数的视图。保存数据的代码是这样的:
if form.is_valid():
parent = form.save();
formsetA = AFormset(request.POST, instance=parent)
formsetB = BFormset(request.POST, instance=parente)
if formsetA.is_valid():
# save first form in inline formset (there always only is one)
# and then assign meta data
a = formset[0].save()
if formsetB.is_valid():
for b in formsetB:
if b.is_valid():
b.save()
检查parent是否有效,保存并设置为内联表单集的实例。然后检查内联表单集。如果表单无效,我将重定向回表单。也不例外。
问题是,如果内联表单集无效,它 returns 到表单,但 parent 已经保存,事务不会回滚。如果我在重定向回表单之前手动回滚事务,我会得到一个异常:
An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
我假设我不能在原子块内手动回滚?
我的主要问题是我应该如何正确处理这种情况,例如。一次保存 parent 和 child?
解决当前问题的方法是不提交父表单保存,然后在提交父表单之前首先检查表单集的有效性:
if form.is_valid():
parent = form.save(commit=False);
formsetA = AFormset(request.POST, instance=parent)
formsetB = BFormset(request.POST, instance=parente)
if formsetA.is_valid() and formsetB.is_valid():
#formsets are valid, parent can be saved
# this assumes if formset is valid, all contained forms are too
parent.save()
a = formset[0].save()
for b in formsetB:
b.save()
我发现,我在不同的模型中有相同的字段名称,所以保存出错了!重命名后所有工作
我有一个表格,我在其中创建了一个新的 "parent" object,正好是一个 child object 类型 A 和 n child objects 类型 B(n 也可以为 0)。我用一个表单和两个内联表单集来做到这一点。
我已经在设置里设置了'ATOMIC_REQUESTS': True
。
我正在使用基于函数的视图。保存数据的代码是这样的:
if form.is_valid():
parent = form.save();
formsetA = AFormset(request.POST, instance=parent)
formsetB = BFormset(request.POST, instance=parente)
if formsetA.is_valid():
# save first form in inline formset (there always only is one)
# and then assign meta data
a = formset[0].save()
if formsetB.is_valid():
for b in formsetB:
if b.is_valid():
b.save()
检查parent是否有效,保存并设置为内联表单集的实例。然后检查内联表单集。如果表单无效,我将重定向回表单。也不例外。
问题是,如果内联表单集无效,它 returns 到表单,但 parent 已经保存,事务不会回滚。如果我在重定向回表单之前手动回滚事务,我会得到一个异常:
An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
我假设我不能在原子块内手动回滚?
我的主要问题是我应该如何正确处理这种情况,例如。一次保存 parent 和 child?
解决当前问题的方法是不提交父表单保存,然后在提交父表单之前首先检查表单集的有效性:
if form.is_valid():
parent = form.save(commit=False);
formsetA = AFormset(request.POST, instance=parent)
formsetB = BFormset(request.POST, instance=parente)
if formsetA.is_valid() and formsetB.is_valid():
#formsets are valid, parent can be saved
# this assumes if formset is valid, all contained forms are too
parent.save()
a = formset[0].save()
for b in formsetB:
b.save()
我发现,我在不同的模型中有相同的字段名称,所以保存出错了!重命名后所有工作