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
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Fall - entfernen Dekorator, können Sie wickeln Sie Teil-code in Ihre anzeigen:
Alle Operationen versucht innerhalb
atomic
bereits ausgeführt wurde, sicher zurück, wenn handle_exception() aufgerufen wird.https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.atomic
except
setzen diehandle_exception()
für einen erfolgreichen rollback?gleiche link - docs "DatabaseError und Ihre Unterklassen wie IntegrityError. Nach so einem Fehler die Transaktion ist gebrochen und Django führt einen rollback am Ende des atomic-Blocks."
wenn Sie möchten, dass die manuelle Handhabung verwenden -
sid = transaction.savepoint()
undtransaction.savepoint_commit(sid)
... jedenfalls Lesen Sie den ganzen, den Google docs-Seite und es wird klar sein,InformationsquelleAutor madzohan
Ich so konfiguriert haben, dass meine db zu
'ATOMIC_REQUESTS'
, so dass jede Anfrage auch geschachtelt in einer Transaktion.War ich auf der Suche nach einem Weg, um rollback ohne eine Ausnahme auszulösen. Ich weiß, das ist nicht die ursprüngliche Frage, aber für den Datensatz der folgenden gearbeitet (django 1.11):
InformationsquelleAutor Arnaud P