Django级联删除和post_delete信号 [英] Django cascade delete and post_delete signal

查看:91
本文介绍了Django级联删除和post_delete信号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中, post_delete 信号记录在特定模型中以及何时将其删除.

In my application post_delete signals being recorded in a specific model and when it was removed.

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进行级联删除时为子实例禁用信号?

When you delete an instance of A cascade delete occurs removing B and C instances. How can I disable signal for child instances on cascade delete by django?

推荐答案

这不是user2059857所建议的优雅解决方案,但更易于实现:

Not an elegant solution as what user2059857 suggested, but a LOT simpler to implement:

为模型A添加一个字段:

Add a field to model A:

being_deleted = models.BooleanField(default=False)`

在触发模型pre_delete信号时将其设置为True:

Set this to True when A model pre_delete signal is fired:

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

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

Check if being_deleted of your A instance is True in every pre_delete of child models and act accordingly.

这篇关于Django级联删除和post_delete信号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆