【问题标题】:How to trigger Django's pre_delete signal?如何触发 Django 的 pre_delete 信号?
【发布时间】:2020-06-25 04:41:19
【问题描述】:

我有一个用户模型和一个包含用户外键的 UserImage 模型。外键设置为 CASCADE 删除。

这是接收器在我的 models.py 中的样子:

@receiver(pre_delete, sender=User)
def deleteFile(sender, instance, **kwargs):
    print("User pre_delete triggered")
    instance.thumbnail.delete()

@receiver(pre_delete, sender=UserImage)
def deleteFile(sender, instance, **kwargs):
    print("UserImage pre_delete triggered")
    instance.image.delete()

当我执行以下代码行时:

>>> User.objects.last().delete()
"UserImage pre_delete triggered"

由于某种原因,正在接收相关联的 UserImage 信号,但实际用户模型的信号未收到。

我错过了什么吗?

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    如果您仔细阅读documentation,您会发现模型上的 delete() 方法将纯粹在 SQL 中执行(如果可能的话)。所以 Django 不会调用 UserImage 上的 delete() 方法,因此不会触发信号。如果您希望触发它,您可以覆盖 User 模型上的 delete 方法,以调用相关对象上的 delete() 。像这样的:

    class User(models.Model):
        def delete(self, using=None):
            self.userimage_set.all().delete()
            super().delete(using=using)
    

    更新:

    我没有正确阅读问题,所以我必须更新我的答案。我认为正在发生的事情是两个信号具有相同的名称,因此第一个被第二个覆盖,因此只有第二个被执行。我建议将函数名称更改为其他名称,看看是否会有所改变。

    【讨论】:

    • 我认为您误读了这个问题。相反的事情发生了。接收到的是 UserImage 信号而不是 User 信号。
    • 哎呀,对不起,我没有正确阅读。 'thumbnail' 是用户上 UserImage 的反向名称吗?>
    • 有什么建议吗?
    • 你能告诉我从 UserImage 到 User 的 FK 字段吗?
    • 我看到这两个函数的名称也完全相同。您可以尝试重命名其中一个,看看会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2016-05-02
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多