Зачем использовать приложения.получить модель () при создании миграции данных?
В соответствии с документами django при создании миграций django мы должны использовать приложения.get_model() вместо импорта моделей и их использования.
Почему миграция данных должна использовать историческую версию модели, а не последнюю?(Исторические версии модели в любом случае не будут использоваться, верно?)
2 ответа:
Он использует исторические версии модели, так что у него не будет проблем с доступом к полям, которые могут больше не существовать в базе кода при выполнении миграции в другую базу данных.
Если вы удалили какое-то поле из своей модели, а затем захотели запустить миграцию в какой-то новой базе данных, и вы импортировали свои модели напрямую, вы можете ожидать, что ваши миграции будут жаловаться, пытаясь использовать поле, которого не существует. При использовании
apps.get_model(...)
Django будет стараться быть умным об этом и использовать определенияmigrations.AddField(...)
из ваших файлов миграции, чтобы дать вам правильную версию вашей модели на данный момент времени.Вот почему Django говорит, что нужно быть осторожным с использованием пользовательских методов Model / Model Manager в ваших миграциях данных, потому что я не верю, что они могут воссоздать эти методы из истории миграций, или поведение может измениться с течением времени, и ваши миграции не будут согласованными.
Рассмотрим эту модель:
Ваша история миграции знает об этих двух полях, и любая дальнейшая миграция будет учитывать это модельное состояние и вносить изменения в это модельное состояние.class A(models.Model): field1 = models.PositiveIntegerField() field2 = models.PositiveIntegerField()
Теперь вы предполагаете, что удалите поле 1, и ваша модель станет:
class A(models.Model): field2 = models.PositiveIntegerField()
И в вашей миграции, вы пытаетесь использовать field1, django должен знать, что field1 существует. Следовательно, когда мы используем
apps.get_model()
, это помогает django использовать историю предыдущих миграций и сделать вывод о field1. В противном случае вы получите ошибка.(правка: исправление опечатки в ответе)