如何触发Django的pre_delete信号?

时间:2020-06-25 04:41:19

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

我有一个User模型和一个UserImage模型,其中包含一个User的外键。外键设置为CASCADE delete。

这是我的模型中接收方的样子。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 信号,但没有收到实际的User模型信号。

我想念什么吗?

1 个答案:

答案 0 :(得分: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)

更新:

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