我有一个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模型信号。
我想念什么吗?
答案 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)
更新:
我没有正确阅读问题,因此必须更新答案。我认为正在发生的事情是两个信号具有相同的名称,因此第一个被第二个信号覆盖,因此仅执行第二个信号。我建议将函数名称更改为其他名称,然后查看是否会更改。