Зачем использовать приложения.получить модель () при создании миграции данных?


В соответствии с документами django при создании миграций django мы должны использовать приложения.get_model() вместо импорта моделей и их использования.

Почему миграция данных должна использовать историческую версию модели, а не последнюю?(Исторические версии модели в любом случае не будут использоваться, верно?)

2 3

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. В противном случае вы получите ошибка.

(правка: исправление опечатки в ответе)