Django应用导入models类报attempted relative import错误怎么解决
Django项目单独运行App内脚本相对导入报错解决方案
错误根本原因
你直接进入coreAnalysis目录运行单文件脚本时,Python会将当前脚本所在目录设为顶层模块搜索路径,无法识别上层Django项目的包结构,因此相对导入失效;且Django运行环境未初始化,即便导入路径正确也会触发配置相关报错。
推荐解决方案(最规范,无后续兼容问题)
使用Django自定义管理命令运行你的逻辑:
- 在
coreAnalysis目录下新建层级目录management/commands,两个新建目录内都要添加空的__init__.py文件 - 在
commands目录下新建自定义命令文件,例如命名为oracle_sync.py,参考内容如下:
from django.core.management.base import BaseCommand from coreAnalysis.models import WorkOrder class Command(BaseCommand): def handle(self, *args, **options): # 此处替换为你原connectionOracle.py内的所有业务逻辑 pass
- 回到项目根目录(和
manage.py同级的最外层AnalysisSite目录),执行命令即可运行:python manage.py oracle_sync
临时快速解决方案(适合调试小脚本)
如果你不想新增自定义命令,直接修改原有脚本并调整运行方式即可:
- 给
connectionOracle.py头部添加Django环境初始化代码,将相对导入改为绝对导入:
import os import django # 加载Django配置 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AnalysisSite.settings') django.setup() # 替换原来的相对导入语句 from coreAnalysis.models import WorkOrder # 下方保留你原有业务逻辑
- 不要进入
coreAnalysis目录运行脚本,切换到项目根目录(和manage.py同级),执行如下命令:python -m coreAnalysis.connectionOracle
使用-m参数会将脚本作为模块运行,Python可以正常识别整个项目的包结构,不会触发父包找不到的错误。
之前操作失效的原因说明
- 直接进入
coreAnalysis目录运行脚本,Python将该目录作为顶层包路径,无法识别上层的项目包结构 - 仅设置
DJANGO_SETTINGS_MODULE环境变量但没有调用django.setup(),Django运行环境未初始化,无法正常加载App和模型 - 之前写的绝对导入路径冗余,正确的导入路径不需要加外层的
AnalysisSite.AnalysisSite前缀,项目根目录默认在Python的模块搜索路径中,直接写coreAnalysis.models即可。
内容的提问来源于stack exchange,提问作者Zain Kinnare
相关产品推荐
相关产品推荐

