#python #google-app-engine
#python #google-app-engine
Вопрос:
Предположим, у меня есть определение модели, подобное этому:
class Image(db.Model):
id = db.StringProperty()
url = db.URLProperty()
Теперь я хочу добавить некоторые поля в эту модель, чтобы она выглядела следующим образом:
class Image(db.Model):
id = db.StringProperty()
url = db.URLProperty()
width = db.IntegerProperty()
height = db.IntegerProperty()
Итак, эта новая модель будет правильно применена к вновь добавленным Image
объектам. Но я также хочу обновить уже существующие объекты, чтобы они содержали эти два новых поля и заполнили их значениями. Получит ли уже существующий объект эти два поля автоматически, чтобы при обращении к ним он выдавал мне пустые поля или это вызовет ошибку? Я полагаю, мне придется создать вспомогательную функцию, которая будет просматривать все существующие объекты и устанавливать новые значения полей, верно? Итак, что я должен иметь в виду и как лучше выполнить это обновление модели? Я думаю, что это иногда будет происходить по мере появления приложения, поэтому я думаю, что было бы полезно иметь какой-то простой поток для этого.
Комментарии:
1. Пару лет назад я написал сообщение в блоге, которое могло бы вам помочь: kupuguy. blogspot.com/2008/05/migrating-models.html
Ответ №1:
Этот точный сценарий описан в GAE docs (раздел статей):
Обновление схемы вашей модели.
По сути, просто измените определение модели, как вы это сделали, затем выполните некоторую операцию, чтобы предоставить значения по умолчанию для всех ваших существующих объектов. Есть несколько способов выполнить вторую часть — в статье описан один.
Комментарии:
1. Спасибо, это как раз то, что мне нужно.
Ответ №2:
Ни один уже существующий объект не получит эти два поля автоматически или не примет их за None. Это вызовет ошибку при обращении к этим полям в существующих объектах. Единственное доступное решение сейчас — использовать remote_apy и написать свой собственный скрипт для обновления существующих записей. Это не составит большого труда, напишите скрипт, чтобы получить все записи в хранилище данных и установить некоторые значения по умолчанию для новых атрибутов..