Korrekte Art der Transaktion.rollback() mit raise exception in django

Arbeite ich mit Django 1.7.1 und python 2.7, ich bin dabei einige POST-Anforderungen, die benötigt werden, um innerhalb einer Transaktion, eigentlich bin ich mit @transaction.atomic() decorator, dass macht die gesamte Funktion innerhalb einer Transaktion.

Soweit ich weiß, dieser Dekorator ist ähnlich commit_on_success und macht einen rollback, wenn ein Datenbank-Fehler ausgelöst.

Ist es möglich, um eine benutzerdefinierte Ausnahme, dass macht die Transaktion ein rollback aber nicht mit Punkte sparen? Ich möchte, um wieder eine HttpResponse, wenn das rollback erledigt ist, zu erklären, warum die Transaktion nicht abgeschlossen wurde.

Habe ich diese.

@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:
        ...

InformationsquelleAutor Alex Lord Mordor | 2014-11-13

Schreibe einen Kommentar