【问题标题】:How is post_delete firing before delete in Django?在 Django 中删除之前如何触发 post_delete?
【发布时间】:2015-05-06 10:56:40
【问题描述】:

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

请注意,该对象将不再存在于数据库中,因此请务必小心处理此实例。

如果我在数据库中查看,记录仍然存在,如果我使用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)
  • 我是直接删除这个实例,它不是正在删除的其他东西的关系
  • 我的模型看起来很正常
  • 我的视图是通用的 DeleteView
  • 我在任何地方都没有找到任何事务性装饰器 - 这是我第一个想到的可能是它的发生方式

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

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

【问题讨论】:

  • 您使用的是哪个数据库后端?我无法在 Django 1.7 中重现。事务管理的重大变化是在 1.6 中进行的,所以我没有任何解释。
  • 您可以发布您的数据库设置吗?

标签: python django django-1.6


【解决方案1】:

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

我真的没有解决方案——我看不到一种方法来询问交易完成后实例或记录将处于的状态(或者甚至是让交易有任何可见性的方法),也看不到任何方法在不显着改变应用程序运行方式的情况下防止这种行为的简单方法。

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

我在我的 post_delete 中为活动记录触发了一个更通用的信号,并且在侦听器中我需要能够检查实例是否正在被删除 - 否则它会绑定一个错误的 GenericRelation 引用一个不存在的 pk,如果我看到关系被删除,我打算做的是取消它 - 但如上所述,我现在无法判断,除非我在 post_delete 内触发信号时传递一个额外的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2015-02-18
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多