2010-11-17 20 views
13

Metoda create() w Django tworzy instancję modelu, a następnie wywołuje metodę save(), która mówi, że wyzwala zatwierdzenie. Więc nie powinno być żadnej różnicy w wyzwalaniu zatwierdzenia transakcji.Django: Różnica między save() i create() z perspektywy transakcji

Ale w rzeczywistości, wykonując metodę, która tworzy grupę instancji modelu przy użyciu funkcji create() na Postgresql, otrzymuję wyjątek transaction aborted, commands ignored until end of transaction. Metoda działa dobrze z nie-transakcyjnych baz danych db. Ponadto, gdy zamieniam create() s na:

m = Model(attr1=..., attr2=...) 
m.save() 

działa również na poziomie Postgresql.

Czy istnieje różnica między używaniem save() i create() w znaczeniu transakcji?

edit: create() również ustawia self._for_write = True przed wywołaniem save(), ale nie mogłem śledzić to, aby zobaczyć, czy ma ona żadnego wpływu na zachowanie transakcji.

edycja: przykładowy kod można znaleźć here.

Odpowiedz

12

Jak już zapewne zauważyć, create() is just a wrapper for save():

The _for_write part najprawdopodobniej przeznaczone tylko dla wyboru bazy danych, więc nie płacić zbyt dużo uwagi.

Jeśli chodzi o błąd "przerwana transakcja", nie widząc kodu, trudno jest określić przyczynę problemu. Może np. naruszyło ograniczenie UNIQUE z create(), co powoduje, że PostgreSQL żąda wycofania transakcji, a następnie wypróbowałeś save() z innymi danymi - trudno powiedzieć bez dokładnego kodu.

+0

dzięki za odpowiedź. dodałem link do przykładowego kodu do pytania. proszę dać mi znać, jeśli pomoże ci dalsze wyjaśnienie. – omat

+0

Może to być problem transakcyjny, taki jak ten: http://stackoverflow.com/questions/2235318/how-do-i-deal-with-this-race-condition-in-django/2235624#2235624 (zauważ, że to MySQL-specyficzne), ale patrząc na twój kod widzę, że dwie wersje nie są równoważne - działająca wersja 'get() s' przez' slug' i 'create() s' z' name', podczas gdy druga wersja ' create() s' z 'name' ** i **' slug'. Być może ta asymetria stoi za problemem. –

Powiązane problemy