Вызывает ли ORM init при извлечении сохраненного экземпляра?

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

Вопрос в том, необходимо ли переносить существующие данные, чтобы применить новые правила по умолчанию, или эти правила будут применяться автоматически всякий раз, когда извлекается устаревший объект?

Чтение исходного кода Я подозреваю ORM восстанавливает набор сохраненных данных, поэтому мне нужно будет обновить все старые записи. Но мне нужна другая пара глаз.

Вызывает ли ORM init при извлечении сохраненного экземпляра?


person John Mee    schedule 12.05.2016    source источник
comment
У меня нет ответа для вас, но каждый раз, когда мне нужно сделать что-то подобное, я сначала обновлю файл модели, затем вручную обновлю БД через MySQL Workbench и т. д. Затем я запущу поддельную миграцию. По какой-то причине я просто не доверяю Джанго, когда дело доходит до таких вещей. Только мой 0,02.   -  person WayBehind    schedule 12.05.2016
comment
Обратите внимание, что документы рекомендуют не переопределять __init__(). Если вы измените поле на ненулевое, вам все равно придется изменить старые данные, чтобы они не нарушали новое ограничение после миграции.   -  person knbk    schedule 12.05.2016


Ответы (1)


Вызывается ли __init__ для модели, когда django создает экземпляр модели? Краткий ответ: да. Если вы используете get или если вы нарезаете набор запросов или повторяете его, будет вызываться __init__.

MyModel.objects.get(pk=1)
MyModel.objects.all()[2]
for p in MyModel.objects.all():
   print p.pk

однако переопределение __init__ не является рекомендуемым способом управления поведением загрузки модели. Это нужно сделать с помощью from_db< /а>

Метод from_db() можно использовать для настройки создания экземпляра модели при загрузке из базы данных.

Аргумент db содержит псевдоним базы данных, из которой загружается модель, field_names содержит имена всех загруженных полей, а values ​​содержит загруженные значения для каждого поля в field_names.

person e4c5    schedule 12.05.2016
comment
Подтверждено: я вставил отпечаток в инициализацию, создал и сохранил экземпляр. Затем, используя get для извлечения, я действительно печатаю I AM INIT во второй раз. - person John Mee; 12.05.2016