Вызываются ли сигналы Django (`post_save`) или методы `.save()` при использовании `.update()`? Почему?

В Django сигнал postsave вызывается сразу после сохранения объекта модели, но не обязательно внутри транзакционной операции.

Короткий ответ

Что ответить на собеседовании

В Django сигнал postsave вызывается сразу после сохранения объекта модели, но не обязательно внутри транзакционной операции.

Подробный разбор

Ответ с пояснениями

В Django сигнал post_save вызывается сразу после сохранения объекта модели, но не обязательно внутри транзакционной операции.

Если сохранение происходит внутри явной транзакции (например, с использованием transaction.atomic()), то post_save срабатывает в момент сохранения, но транзакция может быть ещё не зафиксирована (commit). Это значит, что обработчики post_save могут видеть изменения до фиксации транзакции.

Если важно, чтобы код выполнялся после успешного коммита транзакции, следует использовать сигнал transaction.on_commit(), который позволяет зарегистрировать функцию, вызываемую именно после фиксации транзакции.

Пример:

from django.db import transaction

@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, **kwargs):
    transaction.on_commit(lambda: do_something(instance))

Таким образом, post_save вызывается при сохранении, но не гарантирует, что транзакция уже завершена.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее