python - post_delete 如何在 Django 中删除之前触发?

标签 python django django-1.6

我看到 post_delete 在实例实际从数据库中删除之前在模型上触发,这与 https://docs.djangoproject.com/en/1.6/ref/signals/#post-delete 相反

Note that the object will no longer be in the database, so be very careful what you do with this instance.

如果我查看数据库,记录仍然存在,如果我使用ORM重新查询,则返回记录,相当于实例:

>>> instance.__class__.objects.get(pk=instance.pk) == instance
True

我没有太多相关代码可以展示,我的信号看起来像这样:

from django.db.models.signals import post_delete, post_save

@receiver(post_delete, sender=UserInvite)
def invite_delete_action(sender, instance, **kwargs):
    raise Exception(instance.__class__.objects.get(pk=instance.pk) == instance)
  • 我是直接删除这个实例,它不是被删除的其他东西的关系
  • 我的模特看起来很正常
  • 我的 View 是一个通用的 DeleteView
  • 我在任何地方都没有发现任何事务性装饰器 - 这是我对它可能如何发生的第一个想法

关于我应该从哪里开始调试这到底是怎么发生的,有什么想法吗?有没有人知道这是一个已知的错误,我找不到任何描述此类行为的票证——而且我确信这在我的应用程序的其他各个地方都按预期工作,这些地方似乎没有受到影响。

如果我允许执行继续,实例最终会被删除...所以它不像存在,因为它无法删除它(很确定 post_delete 在这种情况下无论如何都不应该触发)。

最佳答案

我相信我所看到的是因为 Django 的默认事务行为,在请求完成之前不会提交更改。

我真的没有解决方案——我看不出有什么方法可以查询事务完成后实例或记录的状态(甚至没有办法让事务可见),也没有任何方法在不显着改变应用程序运行方式的情况下防止这种行为的简单方法。

我现在选择忽略这个问题,而不是担心我的用例中的影响,事实上,这并没有那么严重——我确实欢迎关于如何正确处理这个问题的任何和所有建议。

我在我的 post_delete 中触发了一个更通用的事件日志信号,并且在监听器中我需要能够检查实例是否正在被删除——否则它会绑定(bind)一个错误的 GenericRelation 引用一个不存在的 pk,如果我看到关系被删除,我打算做的是取消它——但正如所描述的,我现在不能说,除非我在 post_delete 中触发信号时传递一个额外的参数。

关于python - post_delete 如何在 Django 中删除之前触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074733/

相关文章:

python - 定义适用于多个数据帧的运算符

python - Django Rest 框架 - API View 提示 NoneType 响应

python - django 中的 LDAP 身份验证错误

python - 如何告诉 Visual Studio Code 在调试 Django 应用程序时遵循 Django 本身的源代码?

python - 获取相关模型日期字段的最小值(django)

python - 在 Django 1.5/1.6 中设置两种不同类型的用户

python - 登录后Django allauth session JSON可序列化错误

python - 如何在 django-rest-framework 的模型 View 集中取消设置 csrf?

Python,mysql.connector 错误 : No Result Set to Fetch From; cgitb shows correct value being passed to function

python - 如何使用 beautiful soup 来抓取网站来迭代并获取所有值?