Django级联删除和post_delete信号

时间:2014-12-19 12:53:23

标签: django django-models cascading-deletes django-signals

在我的应用程序中post_delete信号记录在特定模型中以及何时被删除。

class A(models.Model):
    ...

class B(models.Model):
    a = models.ForeignKey('A')

class C(models.Model):
    b = models.ForeignKey('B')

def log_delete(sender, instance, **kwargs):
    logging

post_delete.connect(log_delete, sender = A)
post_delete.connect(log_delete, sender = C)

当您删除A级联删除实例时,会删除B和C实例。如何通过django?

禁用级联删除的子实例信号

2 个答案:

答案 0 :(得分:1)

简答:

你不能。

答案很长:

您需要覆盖.delete和模型经理Model的{​​{1}}方法

通过删除前/后删除信号传递删除被调用的实例,我完成了一些类似的任务。

以下是代码https://gist.github.com/ar45/9c1448a91bcc94997ff0

答案 1 :(得分:0)

不像user2059857建议的那样优雅,但实现起来更简单:

向模型A添加字段:

being_deleted = models.BooleanField(default=False)`

当触发模型pre_delete信号时将此设置为True:

@receiver(models.signals.pre_delete, sender=A)
def a_pre_delete(sender, instance, **kwargs):
    instance.being_deleted = True
    instance.save()

检查每个being_deleted子模型中A实例的pre_delete是否为True,并采取相应措施。