Что нужно сделать, если удалить модель из Django 1.7+

Я хочу знать, может ли кто-нибудь дать полный список вещей, которые нужно сделать, когда мы хотим удалить модель из Django. Я знаю, что был задан аналогичный вопрос. Но, похоже, это было несколько лет назад, когда люди все еще использовали Юг для работы с Базой данных. Поэтому я ожидаю ответа на недавнюю версию Django.

Я заключаю то, что знаю:

  • Удалите коды модели с model.py
  • Убедитесь, что ни один другой файл не импортирует эту модель или не использует ее (admin.py, views.py и т.д.)
  • Запуск makemigrations и команды переноса
  • Поскольку Django не очищает базу данных для вас, вы удаляете таблицу эта модель вручную из базы данных
  • Также обратите внимание, что есть таблица под названием ContentTypes, которая хранит записи о нашей информации. Поэтому вам нужно удалить запись для этой модели вручную (но я не знаю, как это сделать в точку. Кто-нибудь даст какое-то объяснение?)

Это все, что я знаю. Что-то не так? И я что-нибудь забыл? Возможно, я слишком осторожен, но я хочу, чтобы база данных была чистой. Большое спасибо!

Ответ 1

В Django 1.7 это на самом деле намного проще, чем вы думаете. Скажем, у вас есть приложение books, с двумя моделями: Book и BookReview. Вы хотите удалить модель Book.

  • Удалите все ссылки на модель Book в вашем коде. Например, удалите поле ForeignKey('books.Book') в модели BookReview. Нет необходимости делать отдельную миграцию для этого изменения.
  • Удалите код для модели Book с books/models.py. Теперь создайте миграцию (manage.py makemigrations). Если вы посмотрите на сгенерированную миграцию, она должна включать операцию migrations.DeleteModel.
  • Запустите автоматически сгенерированную миграцию (manage.py migrate), и вас спросят о соответствующих ContentType объектах, которые больше не нужны:

    Running migrations:
      Applying books.0002_auto_20150314_0604... OK
    The following content types are stale and need to be deleted:
    
        books | book
    
    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?
    

    Вероятно, вы хотите удалить типы контента. Если вы не хотите, чтобы вас запрашивали для ввода, вы можете использовать manage.py migrate --noinput.

    Операция DeleteModel в этом переносе приведет к отбрасыванию таблицы books_book в вашей базе данных, поэтому вам не придется беспокоиться о ручном очистке вообще.