4

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

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

答案可能取决于以下子问题:

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

1 回答 1

5

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

您可以通过查看save_basein的来源来确认这一点django/db/models/base.py。自动提交将发生在第 555 行(在 1.4.2 中),但直到第 564 行post_save才发送信号。您还可以看到 Django 不会尝试在..save()

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

于 2012-11-22T17:12:44.367 回答