Django 1.8升级2.0后启动失败,补on_delete参数仍报错
Django 2.0 升级后
on_delete参数缺失报错排查方案 
问题背景:项目基于Django 1.8版本可正常运行,升级至Django 2.0版本后,执行
python manage.py runserver命令触发报错:__init__() 缺少1个必填位置参数:'on_delete'。开发者已为自定义业务模型中的所有ForeignKey字段补充on_delete=models.CASCADE属性,但报错仍未解决。
针对已完成自定义模型字段修正但仍报错的场景,可按以下方向定位解决:
- 排查第三方依赖包的模型定义
大量适配Django 1.x的第三方应用,自身内置的模型中ForeignKey、OneToOneField字段未声明on_delete参数,这类字段不属于项目自定义模型,修改自身模型无法解决该类报错。可通过控制台输出的报错堆栈,定位到具体触发问题的文件所属依赖包,将对应第三方包升级到适配Django 2.0及以上版本的兼容版本。 - 排查项目内的遗留废弃模型文件
项目迭代过程中留存的旧版本模型文件,即便未被加入INSTALLED_APPS、未参与实际业务逻辑,只要文件位于Python可扫描到的模块路径下,Django启动时就会对这些文件内的字段定义做校验,触发参数缺失报错。可直接删除无引用的废弃模型文件,或为这些旧文件内的关联字段补上on_delete参数。 - 校验用户关联模型的字段配置
若项目自定义了用户模型,需确认模型中所有关联到用户表的外键字段都正确配置了on_delete参数;若仍使用Django内置默认用户模型,需确认django.contrib.auth模块版本与核心Django版本完全匹配,避免版本不一致触发内置字段的校验异常。 - 快速定位报错源头的操作方法
启动服务触发报错时,直接查看控制台输出的完整堆栈日志,定位堆栈中第一个处于项目目录下的文件路径,该路径对应的模型字段就是缺失on_delete参数的具体位置,无需逐文件遍历排查全项目代码。
内容的提问来源于stack exchange,提问作者岛是海的疤
相关产品推荐
相关产品推荐

