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

4 python django django-signals

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

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

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

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

dge*_*gel 5

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

您可以通过查看源代码,确认此save_basedjango/db/models/base.py.自动提交将在第555行(1.4.2)中发生,但直到第564行post_save才发送信号.您还可以看到Django不会尝试使用任何嵌套事务..save()

如果您正在使用django.middleware.transaction.TransactionMiddleware并且没有使用autocommit装饰器覆盖其行为,则会在post_save回滚整个事务期间发生异常,包括对初始实例的更改.