4 python django django-signals
我有一个post_save处理程序,它将其他记录插入到数据库中,引用刚刚创建或更新的实例.但是,插入其他记录时可能会发生错误(可能是违反约束).
如果post_save处理程序中发生异常,是否仍可能提交初始实例?
答案可能取决于这些子问题:
post_save信号之前还是之后提交的?post_save?根据文档,如果您使用的autocommit是初始实例的更改将.save()在任何post_save信号处理程序之前提交.post_save不会将更改回滚到初始实例的异常.
您可以通过查看源代码,确认此save_base在django/db/models/base.py.自动提交将在第555行(1.4.2)中发生,但直到第564行post_save才发送信号.您还可以看到Django不会尝试使用任何嵌套事务..save()
如果您正在使用django.middleware.transaction.TransactionMiddleware并且没有使用autocommit装饰器覆盖其行为,则会在post_save回滚整个事务期间发生异常,包括对初始实例的更改.