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()
с разными данными - это трудно сказать без точного кода.