#python #django #django-migrations
#python #django #django-миграции
Вопрос:
TLDR: модели перемещены в новое приложение. После переноса отношение M2M ссылается на таблицу, которая не существует. Предыдущая таблица M2M не была переименована.
Версия Django: 3.2.3
Сценарий: я занимаюсь рефакторингом приложения Django. В этом процессе я переместил некоторые модели в новое приложение. Для этого я переименовал таблицы, как описано Хаки Бенита, используя SeparateDatabaseAndState
.
Одна из моделей Students
в новом приложении имеет поле с отношением Many2Many к другой модели Teachers
(которую я также переместил в новое приложение).
oldapp/migrations/000X_auto_XXX.py
operations = [
...
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.DeleteModel(
name='Students',
)
],
database_operations=[
migrations.AlterModelTable(
name='Students',
table='newapp_students'
)
]
),
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.DeleteModel(
name='Teachers',
)
],
database_operations=[
migrations.AlterModelTable(
name='Teachers',
table='newapp_Teachers'
)
]
),
...
]
newapp/migrations/0001_initial.py
operations = [
...
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.CreateModel(
name='Teacher',
fields=[...],
options={...},
)
],
database_operations=[]
),
migrations.SeparateDatabaseAndState(
state_operations=[
migrations.CreateModel(
name='Students',
fields=[
...
('teachers', models.ManyToManyField(blank=True,related_name='students', to='newapp.Teachers')),
...
],
options={...},
)
],
database_operations=[]
),
...
]
После запуска python manage.py migrate
все модели были переименованы (пока все хорошо)..
Проблема: автоматически сгенерированная таблица для Many2Many не была переименована ( oldapp_students_teachers
). Однако модель в новом приложении ссылается на таблицу в новом приложении ( newapp_students_teachers
), которая не существует.
Я провел некоторые повторные исследования, и, похоже, эта проблема была решена и исправлена несколько лет назад 41b337efa085b6b9cfdb2cf724d977005ff77e75.
Однако для меня проблема все еще остается. Итак, что я делаю не так?
Ответ №1:
У меня аналогичная проблема при переименовании пользовательской модели, но у меня есть поля в таблицах m2m, которые не изменяются при миграции. Единственное, что я мог придумать, это написать команду управления, которая переименует эти поля. Итак, я полагаю, вы можете сделать то же самое с чем-то вроде этого.
cursor.execute("ALTER TABLE oldapp_students_teachers RENAME TO newapp_students_teachers;" )
Ответ №2:
Для меня таблицы M2M были переименованы правильно… если они не были определены с db_table
помощью . Что имеет смысл, поскольку в противном случае Django не может предположить, что имена соответствуют его соглашениям. В моем случае я мог бы решить эту проблему, добавив AlterField
строки для удаления db_table
из определений полей M2M перед операциями удаления / переименования.