Django: разница между save () и create () с точки зрения транзакции - PullRequest
13 голосов
/ 17 ноября 2010

Метод create () в Django создает экземпляр модели, затем вызывает save (), который, как говорят, вызывает фиксацию. Так что не должно быть никакой разницы в инициировании транзакции.

Но на самом деле, выполняя метод, который создает группу экземпляров модели с использованием create () в Postgresql, я получаю исключение transaction aborted, commands ignored until end of transaction. Метод отлично работает с нетранзакционными бэкэндами БД. Кроме того, когда я заменяю create () с:

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

Он работает и на Postgresql.

Есть ли разница между использованием save() и create() в смысле транзакций?

edit: create () также устанавливает self._for_write = True перед вызовом save (), но я не смог отследить его, чтобы увидеть, влияет ли это на поведение транзакции.

edit: пример кода можно найти здесь .

1 Ответ

13 голосов
/ 17 ноября 2010

Как вы, наверное, видели, create() - это просто оболочка для save():

_for_write часть , скорее всего, предназначена только длядля выбора базы данных, поэтому я бы не стал обращать на это слишком много внимания.

А что касается ошибки «транзакция прервана», то, не видя ваш код, трудно сказать, в чем проблема.Возможно, вы, например, нарушили ограничение UNIQUE с помощью create (), что заставляет PostgreSQL требовать отката транзакции, а затем вы попытались save() с другими данными - без точного кода трудно сказать.

...