django.setup() giving me ModuleNotFoundError: when ran in pycharm

django.setup() giving me ModuleNotFoundError: when ran in pycharm

我已经按照以下设置了一个 Django 项目和该项目的应用程序。 更改模型后,我可以进行迁移和迁移。 我可以 运行 服务器和管理页面按预期显示我的应用程序。 我能够 运行 python manage.py shell,在 shell.

中导入和操作我的模型

然而,当我尝试从另一个 python 文件(在 pycharm 中)导入我的模型时,我收到一条错误消息,指出找不到我的应用程序的模块。

OS:

Distributor ID: LinuxMint
Description:    Linux Mint 19.3 Tricia
Release:    19.3
Codename:   tricia

IDE

PyCharm 2020.2.3 (Community Edition)
Build #PC-202.7660.27, built on October 6, 2020
Runtime version: 11.0.8+10-b944.34 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Linux 5.4.0-52-generic
GC: ParNew, ConcurrentMarkSweep
Memory: 1871M
Cores: 8
Non-Bundled Plugins: Statistic, com.alayouni.ansiHighlight, com.intellij.ideolog, org.toml.lang, ru.meanmail.plugin.requirements, com.jetbrains.plugins.ini4idea
Current Desktop: X-Cinnamon

Python:

python 3.6

Django

Django==3.1.3

我已经阅读了之前的相关问题:django-modulenotfounderror-no-module-named-restaurants and 但我认为我的问题有些不同。

我没有移动文件或更改文件夹名称,我真的尽可能按照教程进行保存(我什至从 django doc 重新创建了 exat poll 应用程序示例并得到了同样的错误)。

我想这与我的环境变量设置不正确有关,但我对这一切都是新手,我不完全了解我应该检查什么,我应该如何检查这些以及最后如何这些可以修复。因此,如果问题与环境变量有关,我将不胜感激。谢谢!

在 pycharm 中,我有几个用于该项目的存储库保存在一个文件夹中,我通常会打开包含 pycharm 中所有存储库的文件夹。 这里感兴趣的回购称为 'static_data' 并且它包含以下树:

├── backend
│   ├── manage.py
│   ├── static_data_app
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── migrations
│   │   │   └── 0001_initial.py
│   │   ├── models.py
│   │   ├── tests.py
│   │   ├── tools
│   │   │   ├── loading.py
│   │   │   ├── new_expiry.py
│   │   │   └── setup.py
│   │   ├── urls.py
│   │   └── views.py
│   └── static_data_project
│       ├── asgi.py
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
├── __init__.py
├── README.md
└── test.py

我有设置 static_data_project/settings.py

INSTALLED_APPS = [
    'static_data_app.apps.StaticDataAppConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

然后当我尝试 运行 static_data/test.py in pycharm 时,其中包含以下代码:

import os
import sys
import django

os.environ['DJANGO_SETTINGS_MODULE'] = 'static_data.backend.static_data_project.settings'
django.setup()

from static_data.backend.static_data_app.models import Asset

if __name__ == '__main__':
    my_list = list(Asset.objects.all())
    print(my_list)

这就是我得到的 (提醒一下,在 pycharm 中,我的所有回购都在某个文件夹中,这里感兴趣的回购称为 'static_data'

/home/[...]/env/bin/python3.6 /home/[...]/static_data/test.py
Traceback (most recent call last):
  File "/home/[...]/static_data/test.py", line 6, in <module>
    django.setup()
  File "/home/[...]/env/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/[...]/env/lib/python3.6/site-packages/django/apps/registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "/home/[...]/env/lib/python3.6/site-packages/django/apps/config.py", line 116, in create
    mod = import_module(mod_path)
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    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 'static_data_app'

Process finished with exit code 1

如果相对于项目目录(包含 manage.py 的目录)进行导入,您会发现它会容易得多

os.environ['DJANGO_SETTINGS_MODULE'] = 'static_data_project.settings'
django.setup()

from static_data_app.models import Asset

如果将 test.py 文件移动到项目目录中,我认为应该可以。如果将test.py文件保留在原处,那么在调用django.setup():

之前需要将项目目录添加到Python路径
import sys
sys.path.append('/path/to/backend')