2015-08-07 13 views
6

Moim zdaniem, jestem zapisywania danych w wielu modelach:Django wiele modeli zapisać pojedynczy popełnić

def myview(request): 
    #do some processing 
    model1.save() 
    model2.save() 

Jak mogę zapewnić, że nie jest likwidowanie model1.save() w przypadku model2.save() zgłosi błąd. Albo w jaki sposób mogę zatwierdzić tylko po pomyślnym zapisaniu obu modeli?

Innymi słowy, "tylko zaoszczędzić model1 i MODEL2 jeśli zarówno save() są skuteczne"

Odpowiedz

16

Użyć atomic transaction:

Atomowość jest własnością definiowania transakcji bazodanowych. atomic pozwala nam stworzyć blok kodu, w którym zagwarantowana jest atomowość bazy danych. Jeśli blok kodu zostanie pomyślnie zakończony, zmiany zostaną zatwierdzone w bazie danych. W przypadku wyjątku zmiany zostaną wycofane.

Przykłady:

from django.db import transaction 

with transaction.atomic(): 
    model1.save() 
    model2.save() 

i

from django.db import transaction 

try: 
    with transaction.atomic(): 
     model1.save() 
     model2.save() 
except IntegrityError: 
    handle_exception() 
+2

aahh !! Doskonały !! Dokładnie tego potrzebuję. Dziękuję –

+1

importowanie transakcji powinno być: od django.db import transakcji – jnvilo

+0

@jnvilo Dzięki. Edytowałem post. – Leistungsabfall