Django项目非app目录导入应用模块报ModuleNotFoundError问题
问题原因
这个报错和Django本身的模型注册逻辑无关,本质是Python模块搜索路径规则导致的:
- 平时执行
python manage.py相关命令(比如runserver、test)时,Python会自动把manage.py所在的项目根目录(即/home/user/dev/project/,也就是和users、testing_utils、内层project配置目录平级的路径)加入模块搜索路径sys.path,同时Django会自动完成应用注册、模型加载流程,所以各个app内部的views、models文件互相导入不会出问题。 - 当你直接运行
testing_utils/dummy_factory.py,或是测试运行器的工作目录不在项目根目录时,Python默认只会把dummy_factory.py所在的testing_utils目录加入搜索路径,这个路径下不存在users包,自然会抛出ModuleNotFoundError。 - 额外注意:你贴出的目录结构存在缩进错误,目前显示
__init__.py、models.py、apps.py这些app核心文件都放在users/tests/子目录下,先确认这些文件实际是直接放在users目录根下、和migrations、templates目录平级,否则users本身就不是合法的Django应用包,在任何位置都无法正常导入。
修复方案
按使用场景选以下方案即可:
- 通用方案:脚本内补全路径并初始化Django
在dummy_factory.py的最顶部、所有项目相关模块的导入语句之前,加入如下代码,手动将项目根目录加入搜索路径,同时完成Django初始化,后续的模型导入就能正常生效:import sys import os # 定位manage.py所在的项目根目录 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) # 加载Django配置 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings") import django django.setup() # 原有业务导入写在后面即可 from abc import ABC from datetime import date from users.models import User - 规范包结构
在testing_utils目录下新建一个空的__init__.py文件,将其标记为正式Python包,避免部分低版本Python或特殊运行环境无法正确识别平级目录的包结构。 - 测试场景固定配置
如果你是用pytest等测试框架运行相关代码,可以在项目根目录新建pytest.ini配置文件,固定搜索路径和Django配置,不需要每个脚本都重复加路径初始化代码:[pytest] DJANGO_SETTINGS_MODULE = project.settings pythonpath = .
内容的提问来源于stack exchange,提问作者user5622143
相关产品推荐
相关产品推荐

