Как переименовать модель с помощью Django?
Допустим, у меня есть эта модель:
class Foo(models.Model):
name = models.CharField(max_length=255)
Я хочу переименовать его в Bar
, Какие шаги я должен предпринять? И как мне иметь дело с The following content types are stale
незамедлительный?
2 ответа
В моем конкретном случае это было так:
- Переименуйте имя класса модели и все его ссылки.
- Бежать
./manage.py makemigrations
, - Проверьте вашу базу данных на наличие ссылок из таблиц ваших собственных приложений. Обычные ссылки и ссылки через
django_content_type
таблица Иметь дело с ними соответственно. Проверьте вашу базу данных на наличие ссылок из таблиц Django. Скорее всего, это будет:
my_table-+-django_admin_log `-auth_permission-+-auth_group_permissions `-auth_user_user_permissions
В моем случае у меня не было записей в
django_admin_log
,auth_group_permissions
,auth_user_user_permissions
,Бежать
./manage.py migrate
, Когда он спрашивает:The following content types are stale and need to be deleted: myapp | foo Any objects related to these content types by a foreign key will also be deleted. Are you sure you want to delete these content types? If you're unsure, answer 'no'. Type 'yes' to continue, or 'no' to cancel:
Вы можете ответить
yes
только если у вас нет записей, ссылающихся на записи вfoo
таблица в трех таблицах, упомянутых выше. Или, если потеря их не является проблемой для вас.
Примечание:
В некоторых случаях, когда вы меняете название модели, а затем запускаете python manage.py makemigrations
вы увидите, что автоматически созданная миграция добавляет новую модель, а затем удаляет старую модель (поле за полем, а затем и саму модель).
Если это произойдет, то вы можете получить эту ошибку при попытке запустить python manage.py migrate
:
django.db.utils.IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails')
Чтобы обойти эту проблему: откройте автоматически созданный файл миграции и отредактируйте его вручную, например так:
operations = [
migrations.RenameModel('Foo', 'Bar'),
]
Затем запустите python manage.py migrate
снова.