![](/img/trans.png)
[英]How do I get a cascading drop down selection box with my foreign keys in Django?
[英]Why does Django do cascading deletes on foreign keys?
Django在具有外键的模型上进行级联删除作为默认值。 也就是说,假设您在A中有一个指向B的ForeignKey,并且您删除了B,那么A也将被删除。
这是众所周知的 ,但是我没有找到任何关于将其作为默认设计决策的合理理由,因为它看起来有多么不直观。 有谁知道为什么会这样?
7年前......
门票开放#7539
它开始被讨论的地方。
几年前由benjaoming
有人请求讨论......我刚刚遇到了这个问题,我缺少的是知道关于级联删除的问题,因为它非常危险(你丢失数据!!)并且窃取了大量时间。 但是,预防它很简单。 覆盖模型的delete()方法并在相关模型的外键上调用clear()很简单,它是一个手动实现,所有程序员都应该能够理解。 但我可以想到另一种选择:如果有问题的外键,如果null = True,为什么在删除相关实例时不自动使用SET NULL? 对我来说,这比CASCADE更“直观”。 毕竟,null = True是程序员指定并且必须在实现中的任何地方处理的东西,这也是他不需要级联删除这种关系的原因。 此外,如果on_delete可以在键字段中设置,则必须符合null选项..并与“intuition argument”一起创建两个选项之间的1:1对应关系。 然后是“逻辑参数”:Django在Python代码中处理它的逻辑,而不是在数据库中处理它,数据库被保存为一个简单的存储引擎。 RESTRICT选项是一个验证问题,在大多数情况下可能会以这种方式处理,因此让数据库强制执行它会是多余的。 在模型级别启用它可以为ModelForms中的一些不错的新自动验证铺平道路,所以我认为这听起来像一个很好的功能。 如果实现了所有这些,我建议从关键字段中删除null选项,并根据on_delete设置它。
多年以后,该小组再次讨论了这个问题。
Django开发人员(对Django本身的贡献)
更改on_delete = CASCADE默认值
我们到了这里。 ForeignKey和OneToOneField on_delete参数
为了提高对级联模型删除的认识,在Django 2.0中将需要ForeignKey和OneToOneField的on_delete参数。
更新模型和现有迁移以显式设置参数。 由于默认值为models.CASCADE,因此将on_delete = models.CASCADE添加到不使用其他选项的所有ForeignKey和OneToOneField。 如果你不关心与旧版Django的兼容性,你也可以将它作为第二个位置参数传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.