Django: разница между save() и create() с точки зрения транзакции

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

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

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

он тоже работает на Postgresql.

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

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

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

Ответы

Ответ 1

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

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

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