python - 如果 post_save handler 出现异常,是否可以提交实例?

标签 python django django-signals

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

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

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

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

最佳答案

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

您可以通过查看 django/db/models/base.pysave_base 的源代码来确认这一点。自动提交将发生 on line 555 (在 1.4.2 中),但未发送 post_save 信号 until line 564 .您还可以看到 Django 不会尝试在 .save() 中使用任何嵌套事务。

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

关于python - 如果 post_save handler 出现异常,是否可以提交实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13517093/

相关文章:

python - 登录 selenium 测试 django 所有身份验证失败

python - Apache Airflow : Gunicorn Configuration File Not Being Read?

python - 在python中动态创建字典

python - 查询集对象不可调用 Django

python - 使用 python 文件作为数据库

python - Django - 有没有办法在我的项目的 signals.py 文件中获取当前登录的用户?

python - 在 Python 中执行函数之前如何进行预检查?

Python - 为什么 'is' 运算符在这种情况下返回 true?

Django:在更新模型之前,我想 "look at"它以前的属性

django - Django pre_save 信号可以对所有派生类起作用吗