Django: 用表单和内联表单集保存新对象(事务管理)。

问题描述 投票:0回答:1

我有一个表单,在这个表单中,我创建了一个新的 "父 "对象,正好是一个类型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.

我想我不能在原子块中手动回滚?

我的主要问题是,我应该如何正确处理这种情况,例如,同时保存父代和子代?

django transactions inline-formset
1个回答
0
投票

解决直接问题的方法是不提交父表单保存,然后先检查表单集的有效性,再提交父表单。

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()
© www.soinside.com 2019 - 2024. All rights reserved.