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()

我发现,我在不同的模型中有相同的字段名称,所以保存出错了!重命名后所有工作