【问题标题】:How to make migrations for a reusable Django app?如何为可重用的 Django 应用程序进行迁移?
【发布时间】:2016-09-28 10:31:06
【问题描述】:

我正在制作一个没有项目的可重用 Django 应用程序。这是目录结构:

/
/myapp/
/myapp/models.py
/myapp/migrations/
/myapp/migrations/__init__.py

当我运行django-admin makemigrations 时,出现以下错误:

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

显然,这是因为我没有配置设置模块,因为这是一个可重复使用的应用程序。但是,我仍然想使用我的应用程序进行迁移。我怎样才能制作它们?

【问题讨论】:

  • 您在应用程序中创建和测试迁移,然后单独运送。

标签: python django migration


【解决方案1】:

实际上,您不需要有项目,您只需要设置文件和脚本即可运行迁移创建。 设置必须包含以下内容(最少):

# test_settings.py

DEBUG = True

SECRET_KEY = 'fake-key'

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'your_app'
]

进行迁移的脚本应该如下所示:

# make_migrations.py

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_settings")
    from django.core.management import execute_from_command_line
    args = sys.argv + ["makemigrations", "your_app"]
    execute_from_command_line(args)

您应该通过python make_migrations.py 运行它。希望它可以帮助某人!

【讨论】:

  • 这很有帮助。为我工作。您不需要迁移脚本@Compadre,django-admin makemigrations 就足够了(在环境变量中正确设置了DJANGO_SETTINGS_MODULE
【解决方案2】:

您需要一个功能强大的 Django 项目(其中安装了您的应用程序)来进行迁移。

执行此操作的一种常见方法是创建一个“测试”项目,其中包含 Django 项目的基本必需品,您可以运行该项目进行迁移等。迁移将在您的应用目录内的正确位置创建,因此您仍然可以在自己的可重用应用程序中进行适当的版本控制等。

以这种方式创建的迁移将是自包含的(假设您的模型不依赖于其他应用的模型),并且可以作为打包的可重用应用的一部分提供。

许多基于 Django 的大型项目实际上将测试项目作为其代码的一部分提供,以便开发人员可以快速运行它以测试应用和进行迁移等。

【讨论】:

  • 我做了一个测试项目,但我无法为我的可重用应用程序创建迁移,该应用程序位于测试应用程序的外部目录中。
  • 我也在为此苦苦挣扎。我可以让下面的“make_migrations.py”脚本工作,但上面的答案由于目录放置而不起作用。
  • 实际上,关于目录放置,我可以通过使用 pip install ..pipenv install -e .. 之类的东西将可重用应用程序包含到测试项目的虚拟环境中来完成这项工作。
【解决方案3】:

创建your_app/migrations_settings.py 文件:

SECRET_KEY = 'fake-key'

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'your_app'
]

然后

export DJANGO_SETTINGS_MODULE=yourapp.migrations_settings
django-admin makemigrations yourapp

【讨论】:

  • 你能分享一下你的包的文件夹结构吗?因为我创建了一个并在主应用程序文件夹的内部和外部使用test_settings.py(与上述相同的内容)进行了尝试。在访问设置模块时,它给了我同样的错误ModuleNotFoundError
  • @SadanArshad 您的主应用程序文件夹(比如yourapp)是否包含__init__ 文件,因此它被视为一个包?如果是这样,那么export DJANGO_SETTINGS_MODULE=yourapp.test_settings 应该可以工作。
【解决方案4】:

Real Python 有一个编写可重用 Django 应用程序的教程。

Bootstrapping Django Outside of a Project章节有一个很有趣的例子:

#!/usr/bin/env python
# boot_django.py

"""
This file sets up and configures Django. It's used by scripts that need to
execute as if running in a Django server.
"""

import os

import django
from django.conf import settings


BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "your_app"))


def boot_django():

    settings.configure(
        BASE_DIR=BASE_DIR,
        DEBUG=True,
        DATABASES={
            "default":{
                "ENGINE":"django.db.backends.sqlite3",
                "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
            }
        },
        INSTALLED_APPS=(
            "django.contrib.auth",
            "django.contrib.contenttypes",
            "your_app",
        ),
        TIME_ZONE="UTC",
        USE_TZ=True,
    )

    django.setup()

然后:

#!/usr/bin/env python
# makemigrations.py

from django.core.management import call_command
from boot_django import boot_django

boot_django()
call_command("makemigrations", "your_app")

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2019-07-23
    • 2019-06-19
    • 2015-03-22
    • 2019-06-24
    • 2016-05-30
    • 2016-11-11
    • 2016-04-14
    • 2020-07-03
    相关资源
    最近更新 更多