Как переименовать модель с помощью Django?

Допустим, у меня есть эта модель:

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

Я хочу переименовать его в Bar, Какие шаги я должен предпринять? И как мне иметь дело с The following content types are stale незамедлительный?

2 ответа

Решение

В моем конкретном случае это было так:

  1. Переименуйте имя класса модели и все его ссылки.
  2. Бежать ./manage.py makemigrations,
  3. Проверьте вашу базу данных на наличие ссылок из таблиц ваших собственных приложений. Обычные ссылки и ссылки через django_content_type таблица Иметь дело с ними соответственно.
  4. Проверьте вашу базу данных на наличие ссылок из таблиц 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,

  5. Бежать ./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 снова.

Другие вопросы по тегам