我有一个post_save处理程序,它将附加记录插入到数据库中,引用刚刚创建或更新的实例。但是,插入附加记录时可能会发生错误(可能违反约束)。
如果处理程序中发生异常post_save,是否仍有可能提交初始实例?
答案可能取决于以下子问题:
- Django 的自动提交模式是在
post_save信号之前还是之后提交? - 如果发生错误,Django 是否会尝试使用嵌套事务来回滚正在保存的实例
post_save?
我有一个post_save处理程序,它将附加记录插入到数据库中,引用刚刚创建或更新的实例。但是,插入附加记录时可能会发生错误(可能违反约束)。
如果处理程序中发生异常post_save,是否仍有可能提交初始实例?
答案可能取决于以下子问题:
post_save信号之前还是之后提交?post_save?根据文档,如果您正在使用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将回滚整个事务,包括对初始实例的更改。