更改 DEFAULT_AUTO_FIELD 时迁移依赖项模型

Fli*_*imm 11 django django-migrations

我正在使用 Django 3.2。我已更改将此行添加到settings.py

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Run Code Online (Sandbox Code Playgroud)

然后我运行这些命令:

$ python manage.py makemigrations
$ python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

makemigrations命令为我的应用程序创建新的迁移文件,不仅是我创建的应用程序,而且还在我的依赖项中。例如,我正在使用django-allauth,并且此文件是在我的虚拟环境 (virtualenv) 中创建的:

 .venv/lib/python3.8/site-packages/allauth/account/migrations/0003_auto_20210408_1526.py
Run Code Online (Sandbox Code Playgroud)

该文件不随django-allauth. 当我从 git 部署此应用程序时,不包含此文件。

我该怎么办?如何进行切换DEFAULT_AUTO_FIELD而不需要为依赖项创建新的迁移文件django-allauth

Fli*_*imm 14

理想情况下,您的第三方依赖项将在以下位置的配置中包含此行apps.py

from django.apps import AppConfig

class ExampleConfig(AppConfig):
    default_auto_field = 'django.db.models.AutoField'
Run Code Online (Sandbox Code Playgroud)

在等待上游依赖项更新其apps.py文件或迁移文件时,您可以自行覆盖应用程序配置。如果它尚不存在,请apps.py在主应用程序目录中创建一个文件(例如:project/apps.py),并覆盖依赖项的配置。在此示例中,我将覆盖以下配置django-allauth

from allauth.account.apps import AccountConfig
from allauth.socialaccount.apps import SocialAccountConfig

class ModifiedAccountConfig(AccountConfig):
    default_auto_field = 'django.db.models.AutoField'

class ModifiedSocialAccountConfig(SocialAccountConfig):
    default_auto_field = 'django.db.models.AutoField'
Run Code Online (Sandbox Code Playgroud)

然后修改INSTALLED_APPSsettings.py如下所示,替换django-allauth本示例中的旧条目:

INSTALLED_APPS = [
    # ....
    # replace: "allauth.account", with
    "projectname.apps.ModifiedAccountConfig",
    # replace: "allauth.socialaccount", with
    "projectname.apps.ModifiedSocialAccountConfig",
]
Run Code Online (Sandbox Code Playgroud)

如果依赖项没有apps.py要覆盖的文件,您仍然可以像这样创建AppConfig子类project/apps.py

from django.apps import AppConfig

class ModifiedExampleDependencyConfig(AppConfig):
    name = 'exampledependency' # the python module
    default_auto_field = 'django.db.models.AutoField'
Run Code Online (Sandbox Code Playgroud)

现在,当您运行时python manage.py makemigrations,不应为依赖项创建任何迁移文件。