[我正在尝试编写一个伪造的脚本,以使用一些伪数据填充我的Django 3.0.4项目,但是在脚本的开始就卡住了。
如果我运行此命令:
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')
import django
django.setup()
我收到此错误:
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'MyProject'
脚本与我的settings.py,urls.py等在同一文件夹中,并且正在django项目的venv中执行。
为什么执行django.setup()时找不到我的项目?
我最初的猜测,因为它是moduleNotFoundError,所以您正在使用项目的显示名称,而不是lib-name。尝试切换到小写的“ myproject.settings”。
在这里找到答案:How to make a script to insert data in my default sqlite3 database django
必须将项目目录附加到sys.path,一切都很好。鉴于脚本正在该目录中运行,这有点奇怪,但它确实有效。还修改了代码以提取脚本路径,而不是像上面的链接那样对其进行硬编码。
最终代码如下:
import os, sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyProject.settings')
import django
django.setup()