Класс Expando является базовым классом для определения моделей данных, свойства которых могут задаваться динамически. Модель типа Expando может состоять из комбинации статических свойств, таких же как в классе Model, и динамических, определяемых во время выполнения приложения.
Класс Expando реализован в модуле google.appengine.ext.db.
Класс Expando является потомком базового класса Model и наследует все методы этого класса. Реализация класса Expando не переопределяет какие-либо из этих методов.
Модель Expando может одновременно содержать как статические, так и динамические свойства. Статические свойства являются такими же как свойства класса Model, и определяются точно также с использованием атрибутов класса модели. Динамические свойства создаются при задании значений экземпляру модели. Два разных экземпляра модели класса Expando могут иметь различный набор динамических свойств и даже содержать динамические свойства одного имени, но разных типов данных. Динамические свойства всегда являются опциональными и не имеют значений по умолчанию: они не будут существовать, пока им не будет присвоено значение.
Динамические свойства не могут использовать экземпляры класса Property для проведения валидации значений, установки их по умолчанию или вычислению каких-либо логических условий. Эти свойства выполняют тривиальное сохранение своих значений в хранилище с использованием поддерживаемых типов данных. Смотрите раздел Классы типов свойств.
Также в отличии от статических свойств, динамические не могут использовать разные имена для атрибутов класса и связанных с ними полей в хранилище. Смотрите раздел Недопустимые имена свойств.
Подсказка: Если вы хотите производить проверку на допустимость значений для динамического свойства с помощью классов Property, вы можете создать их экземпляры и передать значение медоду validate().
Наследник класса Expando может содержать определения статических свойств подобно наследнику класса Model. Статические свойства модели Expando имеют всю ту же функциональность, что у моделей Model. Экземпляр класса Expando может иметь как статические, так и динамические свойства.
import datetime
class Song(db.Expando):
title = db.StringProperty()
crazy = Song(title='Crazy like a diamond',
author='Lucy Sky',
publish_date='yesterday',
rating=5.0)
hoboken = Song(title='The man from Hoboken',
author=['Anthony', 'Lou'],
publish_date=datetime.datetime(1977, 5, 3))
crazy.last_minute_note=db.Text('Get a train to the station.')
Динамические свойства экземпляра класса Expando (в отличии от статических) могут быть удалены. Для проведения удаления приложение выполняет удаление атрибута экземпляра класса:
del myobj.myprop
Конструктор класса модели определен следующим образом:
Является классом модели, чьи свойства не требуется обязательно определять перед использованием. Также как и для класса Model, от Expando необходимо определить класс-наследник, который задает тип объектов данных.
Класс Expando является потомком класса Model и наследует или перекрывает все его методы.
Параметры:
Имя нового объекта. Имя становится частью его первичного ключа. Если задано None, то для ключа используется заданный системой числовой идентификатор.
Значение параметра key_name не должно начинаться с цифры и не может быть вида __*__. Если приложение использует для задания имен ключей объектов введенные пользователем данные (например, адрес электронной почты), то оно должно привести их к допустимому виду, к примеру, добавив в ним префикс, заранее удовлетворяющий системным требованиям.
Значение параметра key_name сохраняется в качестве юникод строки (с конвертацией из типа str).