Выбор ответа Middle Миграции спрашивают часто обновлено

Почему apps.get_model в миграции данных

Вопрос

Почему в функции RunPython модель берут через apps.get_model("blog", "Article"), а не импортом from blog.models import Article?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Историческая модель совпадает со схемой на этом шаге, а импортированная нет. Миграции применяются и через полгода на новой базе, когда модель в коде уже другая: появились поля, которых в базе на этом шаге ещё нет.

Варианты ответа

  1. Импорт моделей в миграциях синтаксически запрещён, и migrate упадёт с ошибкой
  2. get_model работает быстрее, потому что не импортирует модуль моделей целиком
  3. Импорт модели создаёт новую таблицу, если её ещё нет в базе на этом шаге
  4. Историческая модель совпадает со схемой на этом шаге, а импортированная нетправильный ответ

Разбор

Миграции применяются и через полгода на новой базе, когда модель в коде уже другая: появились поля, которых в базе на этом шаге ещё нет. Импортированная модель попробует их читать и упадёт. apps.get_model отдаёт модель, восстановленную из истории миграций. Правда, у неё нет ваших методов и менеджеров, только поля. Синтаксического запрета нет, и на скорость это не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.