Миграции Django не показывают изменений, обнаруженных после переименования таблицы в mysql

#django #django-models

Вопрос:

У меня есть приложение Django с базой данных My-SQL. недавно я изменил имя таблицы с помощью запроса MySQL в MySQL-оболочке, после этого, когда я запускаю команду makemigration и migrate, терминал говорит «Изменений не обнаружено». как я могу решить эту проблему и снова создать эту таблицу с помощью Django для миграции и миграции?

могу ли я удалить таблицу из MySQL, возможно, снова создать Django?

Комментарии:

1. Поделитесь своей моделью, вам не следует переименовывать таблицу с помощью MySQL, так как теперь миграция, которая будет создана, попытается сделать то же самое (и потерпит неудачу, так как таблица больше не имеет старого имени).

2. можно ли удалить таблицу из MySQL, возможно ли создать Django снова?

Ответ №1:

Если вы переименовали свою таблицу за пределами Django — вам придется сообщить Django новое имя таблицы следующим образом (используя Мета-класс):

 class Model(models.Model):
    name = models.CharField(max_length=255)

    class Meta:
        db_table = 'new_table_name'
 

Чтобы заново создать таблицу с использованием существующей модели, вам необходимо сбросить миграцию для этого приложения до нуля, а затем снова запустить миграцию

 python manage.py migrate APP_NAME zero
python manage.py migrate APP_NAME
 

Комментарии:

1. нет , я хочу создать снова ту же таблицу, не беспокоясь об измененной таблице

Ответ №2:

Это связано с тем, что таблица миграций, управляемая django, не отражает правильную схему БД, поскольку она уже была изменена за пределами django. Если у вас нет каких-либо важных данных, вы можете выполнить откат миграции или воссоздать таблицу вручную.

Лучший способ справиться с этим-переименовать вашу таблицу обратно в исходное имя. Затем создайте пустую миграцию внутри своего приложения и воссоздайте команды sql, которые вы выполнили в командной оболочке внутри этого файла миграции. Таким образом, django может отслеживать схему базы данных.

Ответ №3:

Вы должны изменить имя таблицы в models.py не в оболочке MySQL.

От

 class MyModel(models.Model):
   ...
 

Для

 class ThisModel(models.Model):
   ...
 

Или Создайте Модель Прокси-Сервера :

 class ThisModel(MyModel):
    class Meta: 
       proxy = True 
       verbose_name = "ThisModel"
 

Комментарии:

1. я работаю над производством, поэтому это невозможно сделать, потому что после этого мне нужно будет везде менять модель, обновленную

2. хорошо, вы также можете создать модель прокси-сервера для переименования, если вы используете модель в другом месте.