Django 级联删除和 post_delete 信号

标签 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 级联删除子实例的信号?

最佳答案

不是 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子模型并采取相应的行动。

关于Django 级联删除和 post_delete 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27566614/

相关文章:

mysql - 按2个字段组合分组,然后按每组的总和排序,多个注释django

python - Django 模型按人类可读的值进行过滤

mysql - MySQL中的一对一关系和级联删除

c# - Entity Framework 级联删除和延迟加载

django - 在 Django 的 Debug模式下关闭缓存

django - Django Rest Framework批量创建

python - 如何使用 django-authopenid 设置默认组?

c# - Entity Framework 级联删除问题-外键设置为空

django - 需要帮助理解序列化程序中的许多和源字段

python - 在 Django 中跨列聚合