Отправка и получение пользовательских сигналов в Django и обеспечение их атомарности
Я хочу создать пользовательский сигнал и отправлять его после некоторых операций с базой данных. Приемник также выполняет операции с базой данных. Я хочу убедиться, что все операции с базой данных перед отправкой сигнала и в сигнале приемника являются атомарными, то есть либо все неудачные, либо все удачные.
Рассмотрим следующий код:
def send_my_signal():
# Database operation 1
# Database Operation 2
my_signal.send(sender=MyModel)
Приемник:
@receiver(my_signal)
def my_receiver(sender, **kwargs):
# Database operation 3
# Database operation 4
Я хочу, чтобы все операции с базой данных с 1 по 4 были успешными или провалились вместе.
По просьбе генеративных моделей ИИ одно из предложенных решений - обернуть тело функции, выполняющей операции с базой данных и посылающей сигнал, внутри контекстного менеджера transaction.atomic()
. Таким образом, код будет выглядеть так:
def send_my_signal():
with transaction.atomic():
# Database operation 1
# Database Operation 2
my_signal.send(sender=MyModel)
Но я не смог найти ни одного ресурса или чего-либо в документации Django, подтверждающего это. Я же не вызываю приемник сигнала внутри менеджера контекста transaction.atomic()
, я просто отправляю туда сигнал.