Ale*_*dor 7 python django transactions exception-handling
我正在使用Django 1.7.1和python 2.7,我正在做一些需要在事务中的POST请求,实际上我正在使用@transaction.atomic()装饰器使整个函数在一个事务中.
据我所知,这个装饰器类似于commit_on_success并在引发数据库错误时进行回滚.
是否可以引发一个自定义异常,使事务回滚但不使用保存点?我想在回滚完成时返回一个HttpResponse,解释为什么事务没有完成.
我有这个.
@transaction.atomic()
def salida_de_almacen(request):
if request.method == 'POST':
try:
folio = request.POST['folio'] #Folio de la orden
epccoma = request.POST['epc'] #EPCs separados por coma
if folio is None or epccoma is None:
return HttpResponse('Datos Incompletos',status=400)
detalles = ODetalle.objects.filter(orden__folio=folio)
epcs = epccoma.replace(' ','').split(',')
inventario = Inventario.objects.filter(epc__in=epcs)
mal = '' # Items incompletos
for d in detalles:
for i in inventario:
if i.producto.item == d.producto.item:
d.cantidad_entregada+=i.cantidad
i.delete()
if d.cantidad_entregada<d.cantidad_ordenada:
mal+='%s,' % d.producto.item
if mal != '':
>>>> #raise Exception?? <<<<---- I WANT TO RISE AN EXCEPTION HERE TO ROLLBACK THE TR.
return HttpResponse('Items Incompletos: '+mal,status=400)
for d in detalles:
d.status=2 #Status completo
d.save()
return HttpResponse(serial_folio,status=200) # Todo bien
except Exception as e:
return HttpResponse(e.message,status=500)
else:
...
Run Code Online (Sandbox Code Playgroud)
mad*_*han 15
在这种情况下 - 删除装饰器,您可以在视图中包装部分代码:
try:
with transaction.atomic():
# ...
if mal != '':
raise IntegrityError
except IntegrityError:
handle_exception()
Run Code Online (Sandbox Code Playgroud)
atomic当调用handle_exception()时,内部尝试的任何操作都已经安全回滚.
https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic
我已将我的 db 配置为'ATOMIC_REQUESTS',因此每个请求也嵌套在一个事务中。
我正在寻找一种在不引发异常的情况下回滚的方法。我知道,这不是最初的问题,但为了记录,以下工作(django 1.11):
from django.db import transaction
def my_view(request):
# some db interactions
if it_hit_the_fan:
transaction.set_rollback(True)
# return response
Run Code Online (Sandbox Code Playgroud)