Django执行migrate报ImportError相对导入超出顶级包错误
报错原因
这个错误的核心是Python相对导入的层级规则限制:
- 相对导入里的
..代表当前模块所属包的父级包,写导入语句的urls.py位于djangoproject包内,..指向的是djangoproject的上一级——也就是项目根目录,这个目录既没有被Python识别为合法包(没有__init__.py),也不属于当前加载的顶级包范围,跨出顶级包的相对导入会被Python直接拦截抛出错误。 - 执行
migrate命令时触发报错符合Django的运行逻辑:所有manage.py开头的命令启动时,都会先加载settings.py里配置的ROOT_URLCONF指向的根路由文件,哪怕执行的不是路由相关的命令,也会先解析路由文件里的所有导入语句,所以导入错误会直接中断命令执行。
修复方案
直接把djangoproject/urls.py里的相对导入替换为绝对导入即可:
# 替换原有错误导入语句 # from ..hackerapp.Controllers import PersonViewSet, DepartmentViewSet from hackerapp.Controllers import PersonViewSet, DepartmentViewSet
Django启动时会默认把manage.py所在的项目根目录加入Python模块搜索路径,只要已经把hackerapp添加到settings.py的INSTALLED_APPS列表中,这个绝对导入就可以正常工作。
补充说明:相对导入仅能在同一个顶级包的内部层级使用,比如在
djangoproject包内的模块导入同包下的settings,写from . import settings是合法的,但跨顶级应用、跳出顶级包范围的相对导入都是不被允许的。
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

