我之前a similar questio n,但我说错了,这就是为什么需要在新帖子中澄清它。
考虑以下Django设置和视图:
settings.py
DATABASES = {
'default': {
# ...
'ATOMIC_REQUESTS': True,
},
视图:
def my_view(request):
foo = Foo.objects.get(id = 1)
foo.some_field = 'new value'
foo.save()
if some_condition():
# ...
else:
return JsonResponse(json.dumps('Cusom message', ensure_ascii=False),
status = 500,
safe = False)
此代码的问题是如果foo
不正确,some_condition
对象会更新,而我希望事务回滚,因为我发送状态500.有人能给我一个暗示我在这里做错了什么?
答案 0 :(得分:1)
扩展@ Daniel的评论,以下是使用自定义原子块的方法:
from django.db import transaction
def my_view(request):
try:
with transaction.atomic():
foo = Foo.objects.get(id = 1)
foo.some_field = 'new value'
foo.save()
if not some_condition():
raise Exception('This exception is to force rollback')
# ...
except Exception:
return JsonResponse(json.dumps('Cusom message', ensure_ascii=False),
status = 500,
safe = False)
所以这里的诀窍是如果with transaction.atomic()
块由于异常而退出,那么在该事务块中执行的任何语句都会被回滚。我们在with块之外捕获异常,以便我们可以将500响应发送回调用者。