Próbuję utworzyć widok, w którym zapisuję obiekt, ale chciałbym, aby cofnąć, które można zapisać, jeśli zgłoszony zostanie wyjątek. Oto, co próbowałem:Django - Cofnij zapis z transakcją atomową
class MyView(View):
@transation.atomic
def post(self, request, *args, **kwargs):
try:
some_object = SomeModel(...)
some_object.save()
if something:
raise exception.NotAcceptable()
# When the workflow comes into this condition, I think the previous save should be undome
# Whant am I missing?
except exception.NotAcceptable, e:
# do something
Co robię źle? nawet gdy wyjątek zostanie podniesiony, some_object
nadal znajduje się w bazie danych.
Ten widok dotyczy interfejsu API, więc myślę, że muszę obsłużyć każdy możliwy błąd, aby dać odpowiedź json proppera. Czy nie można tego zrobić z dekoratorem atomowym? – Gocht
Nie z dekoratorem imho, ponieważ obsługuje transakcję poza twoją funkcją. Dobry przykład z menedżerem kontekstu! – jpic
Musisz mieć blok atomowy wewnątrz try .. z wyjątkiem bloku, jak w odpowiedzi. Możesz także użyć dekoratora atomowego na widoku, jeśli chcesz. – Alasdair