如何在Django项目外部访问模型?遇ModuleNotFoundError求解
问题:外部脚本无法访问Django模型(ModuleNotFoundError: No module named 'simo')
使用Django 4.1.1版本,项目包含simo应用及对应模型,在Django shell中可正常访问数据库,但通过外部脚本scheduling.py访问时失败,查阅相关问题后仍未解决。
脚本代码
import os import django os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' django.setup() from django.db import models from simo.models import Tasks
已尝试的执行位置
- 与manage.py同级目录
- 与settings.py同级目录
- 与models.py同级目录
项目结构
[mysite] [mysite] [simo] [migrations] views.py models.py urls.py __init__.py apps.py tests.py admin.py settings.py urls.py __init__.py wsgi.py asgi.py scheduling.py __init__.py db.sqlite3 manage.py
错误信息
C:\...\python.exe C:/.../mysite/scheduling.py Traceback (most recent call last): File "C:\...\mysite\scheduling.py", line 5, in <module> django.setup() File "C:\...\lib\site-packages\django\__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "C:\...\lib\site-packages\django\apps\registry.py", line 91, in populate app_config = AppConfig.create(entry) File "C:\...\lib\site-packages\django\apps\config.py", line 178, in create mod = import_module(mod_path) File "C:\...\lib\importlib\__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked ModuleNotFoundError: No module named 'simo' Process finished with exit code 1
解决建议
1. 将项目内层目录加入Python路径
脚本位于外层mysite目录(与manage.py同级),但simo应用在内层mysite目录下,Python无法直接找到该模块。修改脚本,把内层mysite目录的路径添加到sys.path:
import os import sys import django # 添加内层mysite目录到Python路径 sys.path.append(os.path.join(os.path.dirname(__file__), 'mysite')) os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' django.setup() from simo.models import Tasks
2. 确认simo已在INSTALLED_APPS中注册
打开内层mysite目录下的settings.py,检查INSTALLED_APPS列表,确保包含simo或者simo.apps.SimoConfig(根据simo/apps.py中定义的类名)。例如:
INSTALLED_APPS = [ # ... 其他应用 'simo', ]
3. 确保执行脚本的工作目录正确
执行脚本时,确保当前工作目录是外层mysite目录(即包含manage.py的目录)。如果使用IDE,可以在运行配置中指定工作目录;如果用命令行,先cd到该目录再执行脚本。
4. 验证__init__.py文件有效性
确认内层mysite目录和simo目录下的__init__.py文件存在且无语法错误(空文件也可以),这是Python识别包的必要条件。
内容的提问来源于stack exchange,提问作者Pali775
相关产品推荐
相关产品推荐

