Django `db_table` не переименовывает таблицу
Этот вопрос (на удивление) не похож на аналогичные, которые спрашивают о том, как сделать это динамически, или спрашивают, как сделать это в первую очередь. Этот вопрос относится к тем предложениям, которые не работают так, как ожидалось.
Краткое описание ситуации:
- Мы создали серию приложений Django как часть API, используемого в реальном веб-приложении.
- Мы назвали эти приложения так, чтобы это имело смысл в то время, например, "организации" и "аутентификация".
- Теперь мы упаковываем эти приложения в виде распространяемой библиотеки, чтобы сторонние разработчики могли установить наши приложения в свой API.
- У клиента уже есть приложения с названиями "организации" и "аутентификация", что вызывает конфликты (поскольку приложения Django должны иметь уникальные имена).
- Поскольку мы создаем библиотеку многократного использования, мы переименовываем наши приложения с
organizations
наmycompany_organizations
, чтобы сделать их уникальными и различимыми. - Я провел серию миграций, следуя этому руководству, чтобы создать новое приложение и перенести модели без потери данных.
- Все работало, пока кто-то не добавил новое приложение, которое ссылалось на нашу
Organization
модель. В результате миграции возникла ошибкаrelation my_company_organization does not exist
, несмотря на то, что множество внешних ключей уже указывали наmy_company_organizations.organization
и работали нормально. - Я проверил базу данных и обнаружил, что имена таблиц все еще в стиле
organizations_organization
вместоmy_company_organizations_organization
. - Я установил
db_table = "my_company_organization"
на моделиMyCompanyOrganization
, чтобы попытаться переименовать таблицу базы данных. - Я сделал и запустил миграции. Я проверил, что миграция 000x_alter_organization_table была успешно применена.
- Я все еще получаю ту же ошибку при первой миграции в новом приложении.
- Я проверил базу данных,
organizations_organization
Как переименовать таблицу базы данных с помощью миграций Django? Изменение db_table
явно не работает.
Вот код миграции, которая переименовывает таблицу:
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("my_company_organizations", "0005_do_stuff"),
]
operations = [
migrations.AlterModelTable(
name="organization",
table="my_company_organizations_organization",
),
migrations.AlterModelTable(
name="organizationemaildomain",
table="my_company_organizations_organizationemaildomain",
),
]
Ни одна из этих таблиц не переименовывается в my_company_x
после успешного выполнения миграции.
Update: Это работает, если новое приложение зависит не только от последней миграции в приложении my_company_organizations
, но и от последней миграции в старом приложении organizations
(от которого зависит новое приложение). На мой взгляд, это не имеет смысла, поскольку миграции для переименования таблиц и все миграции в старом приложении все равно были выполнены до того, как оно достигло сбойной миграции. Добавление зависимости ничего не должно изменить, поскольку миграции, от которых она зависит, уже выполнены, но по какой-то причине добавление этой зависимости работает, и я вижу переименование в базе данных. Я не могу не считать это ошибкой в Django.