Может ли Django изменять статус экземпляра модели при откате transaction.atomic?

#python #django #transactions

#python #django #транзакции

Вопрос:

Я хочу, чтобы порядок менял статус при возникновении исключения в блоке transaction.atomic.

Работает ли следующий код?

 try:
    with transaction.atomic():
        order = Order.objects.create(
            status='PAYING'
        )
except Exception as e:
    order.status = 'FALIED'
    order.save()
  

Комментарии:

1. Если возникает исключение, скорее order всего, оно не было создано, поэтому вы не можете установить его статус на что-либо…

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

Ответ №1:

Как написано, это не сработает, поскольку create() вызывает исключение, прежде чем оно сможет вернуть значение order .

Обратите внимание, однако, что create() это просто сокращение для создания экземпляра и его сохранения. Таким образом, вы можете написать это таким образом:

 order = Order(status='PAYING')
try:
    with transaction.atomic():
        order.save()
except Exception as e:
    order.status = 'FALIED'
    order.save()