gpt4 book ai didi

python - Django级联删除反向外键

转载 作者:IT老高 更新时间:2023-10-29 00:21:52 30 4
gpt4 key购买 nike

Django 展示了如何在其文档中使用外键设置或覆盖级联删除。

model = models.ForeignKey(MyModel, null = True, on_delete = models.SET_NULL)

但是,如果我们想要相反的效果怎么办?如果我们希望删除 fk 模型导致删除此模型怎么办?

谢谢

最佳答案

有一个非常微妙的实现点,我想我应该添加到这个讨论中。

假设我们有两个模型,其中一个通过外键引用另一个,如下所示:

class A(models.Model):
x = models.IntegerField()

class B(models.Model):
a = models.ForeignKey(A, null=True, blank=True)

现在如果我们删除 A 的一个条目,级联行为将导致 B 中的引用也被删除。

到目前为止,一切都很好。现在我们想扭转这种行为。人们提到的明显方法是使用删除期间发出的信号,所以我们去:

def delete_reverse(sender, **kwargs):
if kwargs['instance'].a:
kwargs['instance'].a.delete()

post_delete.connect(delete_reverse, sender=B)

这似乎是完美的。它甚至可以工作!如果我们删除一个 B 条目,对应的 A 也会被删除。

问题是这有一个循环行为导致异常:如果我们删除A的一个项目,由于默认的级联行为(我们想要保留),B的相应项目也将被删除,这将导致 delete_reverse 被调用,它会尝试删除已删除的项目!

诀窍是,您需要异常处理才能正确实现反向级联:

def delete_reverse(sender, **kwargs):
try:
if kwargs['instance'].a:
kwargs['instance'].a.delete()
except:
pass

此代码将适用于任何一种方式。我希望它可以帮助一些人。

关于python - Django级联删除反向外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655347/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com