我正在尝试运行一个验证对象并保存它们的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()是否适用于非视图函数?找不到答案
答案 0 :(得分:0)
所以,显然 -
transaction.atomic():
默认管理“默认”数据库的事务,除非提到其他数据库:
transaction.atomic(using='otherDB'):
由于我们使用多个数据库并且我所使用的数据库未设置为默认值,因此我错过了“使用”。