我有一个表单,在这个表单中,我创建了一个新的 "父 "对象,正好是一个类型A的子对象和类型B的n个子对象(n也可以是0)。我用一个表单和两个inlineformsets来做这件事。
我在设置中设置了 '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()
检查父数据是否有效,保存并设置为内联表格集的实例。然后检查内联表单集。如果表单无效,我重定向回表单。没有例外。
问题是,如果一个内联表单集无效,它会返回到表单,但父表单已经被保存,事务没有回滚。如果我在重定向回表单之前手动回滚事务,就会出现异常。
An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.
我想我不能在原子块中手动回滚?
我的主要问题是,我应该如何正确处理这种情况,例如,同时保存父代和子代?
解决直接问题的方法是不提交父表单保存,然后先检查表单集的有效性,再提交父表单。
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()