
当在 Django 项目中尝试导入同级应用内的自定义模块(如 uniqueid.py)时,若直接使用 import uniqueid 会触发 ModuleNotFoundError,根本原因在于 Python 的模块搜索路径未包含当前应用目录,需采用相对或绝对路径方式显式导入。
当在 django 项目中尝试导入同级应用内的自定义模块(如 `uniqueid.py`)时,若直接使用 `import uniqueid` 会触发 `modulenotfounderror`,根本原因在于 python 的模块搜索路径未包含当前应用目录,需采用相对或绝对路径方式显式导入。
在 Django 项目结构中,Python 解释器默认从项目根目录(即 manage.py 所在目录)开始解析模块路径,而非从当前文件所在目录。因此,即使 uniqueid.py 和 models.py 位于同一应用目录(如 media/)下,import uniqueid 仍会被解释为从 Python 路径(如 sys.path)中查找顶层名为 uniqueid 的包——而该模块并不存在于全局命名空间中。
✅ 正确做法是使用绝对导入或显式相对导入:
-
推荐:绝对导入(清晰、可维护、符合 Django 最佳实践)
假设你的项目结构如下:myproject/ ├── manage.py ├── myproject/ │ ├── __init__.py │ └── settings.py └── media/ ├── __init__.py ← 必须存在! ├── models.py └── uniqueid.py在 media/models.py 中应写为:
# media/models.py from media.uniqueid import media_article_id class NewsArticle(models.Model): id = models.CharField( max_length=10, default=media_article_id, # 注意:传函数对象,不加括号 editable=False )⚠️ 关键点:
- media/ 目录下必须包含 __init__.py(可为空),使其成为合法的 Python 包;
- default 参数应传递函数引用 media_article_id,而非调用结果 media_article_id(),否则会在模型类定义时提前执行(导致所有实例共享同一 ID);
- 避免 import uniqueid 或 import media.uniqueid as uid 后通过 uid.media_article_id 调用——虽可行,但不如直接导入函数简洁安全。
-
替代方案:相对导入(仅限包内使用)
若坚持在 models.py 中使用相对导入(需确保其属于包内模块):# media/models.py from .uniqueid import media_article_id # ✅ 正确的相对导入
❌ 常见错误排查:
- 忘记在 media/ 目录添加 __init__.py → 导致 Python 不识别为包;
- 在 models.py 中写 import uniqueid → Python 尝试导入顶层模块,失败;
- default=uniqueid.media_article_id() → 括号导致函数立即执行,破坏每次创建实例时生成新 ID 的逻辑;
- PYTHONPATH 未配置或 IDE 运行环境与终端不一致 → 建议统一使用 python manage.py runserver 启动,避免路径混淆。
? 小结:Django 项目中的模块导入本质是 Python 包机制的延伸。始终以项目根目录为基准,通过 from app_name.module_name import ... 实现可靠、可移植的导入,既避免路径歧义,也利于团队协作与代码审查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











