from django.db.models.signals import post_delete
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(post_delete, sender=MyModel)
def my_post_delete_callback(sender, **kwargs):
#Sender is the model which when deleted should trigger this action
#Do stuff like delete other things you want to delete
#The object just deleted can be accessed as kwargs[instance]
2条答案
按热度按时间nuypyhwy1#
有一个非常微妙的实施点,我认为我应该添加到这个讨论。
假设我们有两个模型,其中一个通过外键引用另一个,如下所示:
现在,如果我们删除A的一个条目,级联行为将导致B中的引用也被删除。
到目前为止,一切都很好。现在我们想扭转这种行为。正如人们提到的,显而易见的方法是使用删除过程中发出的信号,所以我们这样做:
这似乎是完美的。它甚至工作!如果我们删除一个B条目,相应的A也会被删除。
问题是这有一个循环行为,它会导致异常:如果我们删除A的一个项,由于默认的级联行为(我们希望保留),B的相应项也将被删除,这将导致调用delete_reverse,它试图删除一个已经删除的项!
诀窍是,您需要EXCEPTION HANDLING来正确实现反向级联:
这段代码无论哪种方式都可以工作。我希望它能帮助一些人。
blmhpbnm2#
我不认为你所看到的特性是一个ORM或者数据库的概念,你只是想在删除一些东西时执行一个回调。
因此,使用
post_delete
信号并在其中添加回调处理程序