如果post_save处理程序中发生异常,可以提交实例吗?

时间:2012-11-22 16:51:38

标签: python django django-signals

我有一个post_save处理程序,它会根据刚刚创建或更新的实例将其他记录插入数据库。但是,插入其他记录时可能会发生错误(可能是违反约束)。

如果post_save处理程序中发生异常,是否仍可能提交初始实例?

答案可能取决于这些子问题:

  • Django的自动提交模式是在post_save信号之前还是之后提交的?
  • 如果post_save发生错误,Django是否会尝试使用嵌套事务来回滚正在保存的实例?

1 个答案:

答案 0 :(得分:5)

根据文档,如果您使用autocommit初始实例的更改将在任何.save()信号处理程序之前在post_save上提交。 post_save中的异常不会将更改回滚到初始实例。

您可以通过查看save_basedjango/db/models/base.py的来源来确认这一点。自动提交将发生on line 555(在1.4.2中),但post_save信号未发送until line 564。您还可以看到Django不会尝试在.save()中使用任何嵌套事务。

如果您正在使用django.middleware.transaction.TransactionMiddleware并且未使用autocommit装饰器覆盖其行为,则post_save期间的异常将回滚整个事务,包括对初始实例的更改。< / p>