不使用管理器时 Django 无法设置

Django cannot setup when not using manager

我遇到了一个奇怪的问题,希望以前有人遇到过。

我有一个位于 my_project/my_app/scripts/custom_script.py 的自定义脚本 -- 我想要的用例是为这个脚本提供一个文件路径并让它处理文件和 load/modify 我数据库中的一些数据。

这是该脚本的一个片段:

import django

def setup_django(env):
    if env == 'dev':
        settings = "my_project.my_project.dev_settings"
    elif env == 'stg':
        settings = "my_project.my_project.staging_settings"
    elif env == 'prod':
        settings = "my_project.my_project.prod_settings"
    else:
        raise ValueError("Invalid choice for --env argument: {}".format(env))

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings)
    django.setup()


def main():

    env = 'dev'
    setup_django(env)

    # Do stuff with my script

当我 运行 从与我的项目相同的 virtualenv 中执行上述操作时,我收到错误 ModuleNotFoundError: No module named 'my_app'

在设置文件中:

...
INSTALLED_APPS = [
    'my_app',
    'django.contrib.admin',
    'django.contrib.auth',
    ...
]
...

似乎,当我调用 django.setup() 时,它会解析我的 dev_settings 文件并在 INSTALLED_APPS 列表中找到 my_app,然后尝试导入它直接(例如 import my_app)。这永远行不通,因为 my_appmy_project 的子模块(应该是 import my_project.my_app)。这是目录结构的示例:

my_project
├── my_project
│   ├── __init__.py
│   ├── dev_settings.py
│   ├── prod_settings.py
│   ├── staging_settings.py
│   ├── urls.py
│   └── wsgi.py
├── my_app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── scripts
│   │   ├── __init__.py
│   │   ├── **custom_script.py**
│   │   └── utils.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── __init__.py
└── manage.py

此设置文件似乎在 manage.py 中工作良好,在 runservershell 中均如此(可以找到 my_app 应用程序)。然而在 custom_script.py 里面,一切似乎都丢失了。

有什么想法吗?

使用 management commands 将自定义脚本添加到您的应用程序,以便正确加载所有 Django 配置。

在您的 my_app 文件夹中,创建以下文件夹结构

management/
   __init__.py
   commands/
      __init__.py
      my_command.py

my_command.py

from django.core.management import BaseCommand

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('running custom command')

在你的 shell

python manage.py my_command