如果post_save处理程序中发生异常,可以提交实例吗?
作者:互联网
我有一个post_save处理程序,它引用刚刚创建或更新的实例的数据库中的其他记录.但是,插入其他记录时可能会发生错误(可能是违反约束).
如果post_save处理程序中发生异常,是否仍可能提交初始实例?
答案可能取决于这些子问题:
>在post_save信号之前或之后,Django的自动提交模式是否提交?
>如果post_save中发生错误,Django是否会尝试使用嵌套事务来回滚正在保存的实例?
解决方法:
根据文档,如果您使用自动提交,则在任何post_save信号处理程序之前,将在.save()上提交对初始实例的更改. post_save中的异常不会将更改回滚到初始实例.
您可以通过查看django / db / models / base.py中save_base的源来确认这一点.自动提交将发生on line 555(在1.4.2中),但post_save信号未发送until line 564.您还可以看到Django不会尝试在.save()中使用任何嵌套事务.
如果您使用的是django.middleware.transaction.TransactionMiddleware并且没有使用自动提交装饰器覆盖其行为,则post_save期间的异常将回滚整个事务,包括对初始实例的更改.
标签:python,django,django-signals 来源: https://codeday.me/bug/20190620/1246771.html