Django: переименование моделей, таблица M2M не переименована

#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 перед операциями удаления / переименования.