django中的models.ForeignKey 的 on_delete参数该如何选择

报错信息 

当django升级到2.0之后,表与表之间关联的时候必须填写“on_delete”参数,否则报错:

 TypeError: __init__() missing 1 required positional argument: 'on_delete'

解决办法是定义外键时补充on_delete参数

 补充信息

在Django模型中定义ForeignKey字段时,on_delete参数用于指定删除关联对象时的行为。主要有以下几种选择:

  • models.CASCADE: 级联删除,删除关联对象时同时删除本对象。
  • models.PROTECT: 保护,防止删除关联对象。
  • models.SET_NULL: 将ForeignKey设置为null,适用于非必填关联。
  • models.SET_DEFAULT: 将ForeignKey设置为默认值,需指定默认值。
  • models.SET(): 设置为指定值
  • models.DO_NOTHING: 不做任何操作,可能导致数据库完整性错误。

在选取on_delete策略时,通常的考虑有:

  • 数据一致性:删除时是否保持数据一致。
  • 业务逻辑:是否允许删除,有无逻辑依赖。
  • 数据完整性:是否可能造成数据库错误。
  • 性能:某些策略如CASCADE会降低数据库性能。

所以通常建议是:

  • 必填字段使用PROTECT阻止删除。
  • 重要数据使用PROTECT或者CASCADE策略。
  • 非必填使用SET_NULL或SET_DEFAULT。
  • 谨慎使用DO_NOTHING,需要明确数据回收策略。

需要根据具体业务需求来选择最合适的on_delete策略。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值