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

时间:2015-05-06 10:56:41

标签: python django django-1.6

在实际从数据库中删除实例之前,我在模型上看到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不应该在这种情况下触发)。

1 个答案:

答案 0 :(得分:1)

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

我没有真正的解决方案 - 我无法在交易完成后看到一种询问状态的实例或记录的方法(或者甚至是一种方式来查看事务)也没有任何简单的方法来防止这种行为,而不会显着改变应用程序的运行方式。

我现在选择忽略这个问题,而不是担心我的用例中的影响,实际上并不是那么严重 - 我欢迎任何关于如何妥善处理这个问题的建议但是。

我为post_delete中的活动记录发出了一个更通用的信号,并且在监听器中我需要能够检查实例是否被删除 - 否则它会绑定引用不存在的pk的错误GenericRelation,如果我看到关系被删除,我打算做的就是取消它 - 但正如所描述的那样,我不能告诉你,除非我在post_delete中发出信号时传递额外的参数。 / p>