完成for循环后,Django手动失败事务

时间:2018-03-19 12:07:27

标签: python django transactions

我正在尝试运行一个验证对象并保存它们的for循环,如果至少有一个失败,我想要失败,但只有在遍历所有对象之后。我尝试了不同的方法,但是在所有方法上 - 即使有异常,至少有一个对象被保存到DB。在最新版本中,请参见下文,我正在尝试设置

transaction.set_rollback(True)

如果至少引发了异常。

try:
    is_failed = False
    with transaction.atomic():
        for identifier, spec in spec_dict.items():
            try:
                spec_data = {'title':my_title,
                             'identifier': identifier,
                             'updated_by': user_id,
                             'created_by': user_id
                }
                serializer = SpecSerializer(data=spec_data)
                serializer.is_valid(raise_exception=True)
                serializer.save()

            except DataError as DE:
                print("** in DataError")
                is_failed = True
                pass

            except ValidationError as VE:
                print("** in ValidationError")
                print(str(VE))
                is_failed = True
                pass

            except Exception as Exc:
                print("** inside Exception: " + str(Exc))
                is_failed = True
                pass

        if is_failed:
            transaction.set_rollback(True)
except IntegrityError:
    print("** inside integrity error")
    pass

似乎'set_rollback'不会影响交易。值得一提的是我们所有的http请求都包含在事务中。

编辑: transaction.atomic()是否适用于非视图函数?找不到答案

1 个答案:

答案 0 :(得分:0)

所以,显然 -

transaction.atomic():

默认管理“默认”数据库的事务,除非提到其他数据库:

transaction.atomic(using='otherDB'):  

由于我们使用多个数据库并且我所使用的数据库未设置为默认值,因此我错过了“使用”。