Можете ли вы безопасно обновить Django AppConfig.label?
Я нахожусь в процессе слияния двух проектов Django, однако они имеют конфликтующие имена приложений.
Например, конфликтующими названиями приложений являются customer, order и product, которые подразделяются на подкаталоги ecommerce и wholesale.
project
├── manage.py
├── apps
│ └── ecommerce
│ └── customer
│ └── order
│ └── product
└── wholesale
│ └── customer
│ └── order
│ └── product
В документации для AppConfig.label
ясно сказано, что изменение метки после применения миграций приведет к ломающим изменениям.
Я пробовал создать пустую миграцию, чтобы вручную переименовать таблицу, а затем обновить параметр Model Meta app_label
, однако это, похоже, также приводит к разрывающим изменениям.
migrations.AlterModelOptions(
name='Product',
options={'app_label': 'wholesale_product'},
),
migrations.AlterModelTable(
name='Product',
table='wholesale_product_product',
),
Мне кажется, что должно быть легко просто переименовать таблицу. Как лучше всего разрешить конфликт имен? Есть ли способ сделать это без переименования приложений и перемещения моделей?
Вы действительно можете изменить ярлык своего приложения
apps/ecommerce/customer/apps.py
class CustomerConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.ecommerce.customer"
label = "ecommerce_customer" # You can also remove this to use the default -customer label
apps/wholesale/customer/apps.py
class CustomerConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.wholesale.customer"
label = "wholesale_customer"
Не забудьте изменить установленные_приложения в файле settings.py
INSTALLED_APPS=[
...
"apps.wholesale.customer",
"apps.ecommerce.customer",
...
]
Также в вашем проекте urls.py
urlpatterns = [
path("ecommerce/customers/", include("apps.ecommerce.customer.urls")),
path("wholesale/customers/", include("apps.wholesale.customer.urls")),
]
Что касается переименования существующей таблицы, я бы посоветовал вам попробовать использовать raw sql
после того, как модель перешла из одного приложения в другое
ALTER TABLE oldapp_mymodel RENAME TO newapp_mymodel;
Тогда вы можете сделать миграции для своих приложений и подделать их, сделав следующее
python manage.py makemigrations old_app
python manage.py migrate old_app --fake