【问题标题】:Can Django changes model instance status when transaction.atomic rolled back?当 transaction.atomic 回滚时,Django 可以更改模型实例状态吗?
【发布时间】:2020-10-30 08:30:03
【问题描述】:

我希望在 transaction.atomic 块中引发异常时更改订单状态。

下面的代码有效吗?

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

【问题讨论】:

  • 如果引发异常,可能order 尚未创建,因此您无法将其状态设置为任何内容...
  • 也没有理由假设如果第一次保存失败,第二次应该可以工作,但这可能是因为这个例子过于简单了。

标签: python django transactions


【解决方案1】:

正如所写的那样,这是行不通的,因为 create() 在返回 order 的值之前会引发异常。

但请注意,create() 只是创建实例并保存它的简写。所以你可以这样写:

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

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2022-06-21
    相关资源
    最近更新 更多