
当 Django 项目中尝试从同级应用内导入自定义模块(如 uniqueid.py)却报 ModuleNotFoundError,根本原因在于 Python 的模块搜索路径未包含当前应用目录,且未使用符合包结构的显式导入语法。
当 django 项目中尝试从同级应用内导入自定义模块(如 `uniqueid.py`)却报 `modulenotfounderror`,根本原因在于 python 的模块搜索路径未包含当前应用目录,且未使用符合包结构的显式导入语法。
在 Django 项目中,Python 解释器默认以项目根目录(即包含 manage.py 的目录)为起点解析模块导入,而非当前文件所在路径。因此,即使 uniqueid.py 和 models.py 同处于 media/ 目录下,直接写 import uniqueid 会被解释为“从项目根目录导入顶层模块 uniqueid”,而该模块并不存在——从而触发 ModuleNotFoundError。
✅ 正确做法是采用绝对导入或显式相对导入,确保路径明确、可维护:
✅ 推荐方案:绝对导入(推荐用于 Django)
假设你的项目结构如下:
myproject/ ├── manage.py ├── myproject/ # 项目配置包 ├── media/ # Django 应用 │ ├── __init__.py │ ├── models.py │ └── uniqueid.py
在 media/models.py 中应写成:
立即学习“Python免费学习笔记(深入)”;
# 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 —— 虽可行,但不如直接导入函数清晰安全。
❌ 不推荐方案:修改 sys.path 或使用隐式相对导入
# ❌ 错误示例:破坏可移植性,易引发部署问题 import sys sys.path.append(os.path.dirname(__file__)) # 不推荐 import uniqueid
? 验证导入是否生效
可在 Django shell 中快速测试:
python manage.py shell
>>> from media.uniqueid import media_article_id >>> media_article_id() '19384726' # 随机生成的 8 位数字字符串
? 总结:Django 中模块导入必须遵循 Python 的包导入规则——以项目根为基准,通过 from app_name.module_name import ... 显式声明路径。忽略 __init__.py、误用隐式导入或混淆函数调用时机,是此类错误的三大常见根源。


















