You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:18:25