
当在 Django 应用(如 media)中尝试导入同目录下的自定义模块(如 uniqueid.py)时,若直接使用 import uniqueid 会触发 ModuleNotFoundError,根本原因在于 Python 的模块搜索路径未包含当前应用目录,需采用相对或绝对导入方式解决。
当在 django 项目中尝试导入同级应用内的自定义模块(如 `uniqueid.py`)时,若直接使用 `import uniqueid` 会触发 `modulenotfounderror`,根本原因在于 python 的模块搜索路径未包含当前应用目录,需采用相对或绝对导入方式解决。
在 Django 项目结构中,Python 并不会自动将每个 Django 应用(如 media/)视为独立的可导入包——除非该目录下存在 __init__.py 文件且导入路径符合 Python 的模块解析规则。你遇到的错误:
ModuleNotFoundError: No module named 'uniqueid'
说明解释器在 sys.path 中未找到名为 uniqueid 的顶层模块。虽然 uniqueid.py 与 models.py 处于同一目录(media/),但 import uniqueid 是绝对导入语法,它要求 uniqueid 是一个位于 Python 路径根目录(如项目根目录或已安装包中)的顶层模块,而并非“同目录模块”。
✅ 正确做法是使用 相对导入 或 显式绝对导入:
✅ 推荐方案:绝对导入(推荐,清晰且兼容 Django 环境)
确保 media/__init__.py 存在(即使为空),然后在 media/models.py 中改为:
立即学习“Python免费学习笔记(深入)”;
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
# media/models.py
from . import uniqueid # 相对导入:从当前包(media)导入 uniqueid
class NewsArticle(models.Model):
id = models.CharField(
max_length=10,
default=uniqueid.media_article_id,
editable=False
)或使用更明确的绝对导入(基于项目根目录):
# 假设项目结构为:myproject/ (manage.py 所在目录)
# └── media/
# ├── __init__.py
# ├── models.py
# └── uniqueid.py
from media import uniqueid # 绝对导入:从项目根下的 media 包导入
class NewsArticle(models.Model):
id = models.CharField(
max_length=10,
default=uniqueid.media_article_id,
editable=False
)⚠️ 注意事项:
- 必须确保 media/__init__.py 文件存在(哪怕为空),否则 media 不被视为 Python 包,相对/绝对导入均会失败;
- 不要使用 import uniqueid —— 这仅在 uniqueid.py 位于 PYTHONPATH 根目录时才有效,而 Django 默认不将各 app 目录加入 sys.path;
- 避免使用 import media.uniqueid as uid(如答案中建议)——这在 models.py 内部会引发循环导入风险(因 media 包尚未完全加载),且冗余;应优先用 from . import uniqueid;
- default 参数值在模型定义时即被求值,因此 uniqueid.media_article_id 必须是可调用对象(函数),而非调用结果(即不能写 default=uniqueid.media_article_id())。你当前写法正确 ✅。
? 补充:若需在 Django shell 或迁移中安全使用,建议为 default 显式传入函数引用,并确认该函数无副作用、返回字符串(符合 CharField 类型)。
总结:Django 应用内模块导入失败,本质是 Python 包机制未被正确启用。只需补全 __init__.py + 使用 from . import xxx,即可可靠、可维护地组织应用内逻辑。

















