python - 在 django 中引发异常的 transaction.rollback() 的正确方法

标签 python django exception-handling transactions

我正在使用 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:
        ...

最佳答案

在这种情况下 - 删除装饰器,您可以在 View 中包装部分代码:

try:
    with transaction.atomic():
        # ...
        if mal != '':
            raise IntegrityError

except IntegrityError:
    handle_exception()

在调用 handle_exception() 时,在 atomic 中尝试的任何操作都已经安全回滚。

https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic

关于python - 在 django 中引发异常的 transaction.rollback() 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26918115/

相关文章:

Python lambda 和作用域

python - dask 数组上的 if 语句

python - PyTables 与 SQLite3 插入速度

python - 编写了一个从现有插件创建 Django-CMS 插件的命令

python - Django:远程访问 PythonAnywhere MySQL 数据库

c# - gRPC c# 中的全局异常处理

python - 您可以将 "missing data"的标签添加到 Altair 图表的图例中吗?

django - session 作为 Django REST 中的持久存储?

c# - 类构造函数中的异常处理

java - 导致无限循环的异常处理(java)