Можете ли вы безопасно обновить 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
Вернуться на верх