报错信息
当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策略。