Следует ли мне избегать использования моделей в миграции django?

Я работаю над существующим проектом Django, который содержит код миграции, например:

someFluffyModel.objects.all().delete()

or

someModel = SomeModel(....)
someModel.save()

Теперь везде, где есть такой код и более новые миграции изменяют схему, отражающую текущую версию модели, возникает проблема с применением миграций с нуля.

Насколько я понимаю, причина в том, что модель, используемая при миграции, не отражает модель, используемую при миграции в тот момент времени. Как я обнаружил, фикстуры могут помочь в загрузке данных, но как насчет удаления? Является ли предпочтительным способ ручного удаления данных из базы данных?


person Andreas    schedule 30.03.2018    source источник
comment
у вас уже есть миграции?   -  person anjaneyulubatta505    schedule 30.03.2018
comment
Это все полностью задокументировано. Используйте замороженные версии моделей, доступных в рамках миграции.   -  person Daniel Roseman    schedule 30.03.2018
comment
возвращаясь к документам, хотя это не нужно делать вручную, но, возможно, загрузка моделей через `apps.get_model('blog', 'Post')` может помочь, простите мое невежество. Я новичок в django, и я имею дело со сторонним кодом xD   -  person Andreas    schedule 30.03.2018
comment
@DanielRoseman спасибо за указатель, который сработал :) (а также за то, что не дал полный ответ, так как это лучший способ узнать)   -  person Andreas    schedule 30.03.2018


Ответы (1)


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

def forwards_func(apps, schema_editor):
    # We get the model from the versioned app registry;
    # if we directly import it, it'll be the wrong version
    Country = apps.get_model("myapp", "Country")

Таким образом, если вы попытаетесь повторно запустить свои миграции в какой-то момент в будущем со схемой модели x'', старые миграции будут выполняться с использованием x' и x в зависимости от их зависимостей.

Любой ценой избегайте прямого импорта моделей в свои миграции.

Всегда важно иметь возможность повторно запускать миграции, поскольку это позволяет выполнять миграцию вперед и назад между средами, откатывать ошибочные развертывания и, прежде всего, запускать тесты. Если вы делаете это неправильно, ваши тесты потерпят неудачу в какой-то момент, когда вы доберетесь до схемы x ', и вам придется следовать правильному подходу, упомянутому выше, чтобы исправить их.

Спасибо @Daniel Roseman за предоставление мне нескольких указателей, которые день.

person Andreas    schedule 20.04.2021