Класс Expando

Класс 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

Конструктор

Конструктор класса модели определен следующим образом:

class Expando(parent=None, key_name=None, **kw)

Является классом модели, чьи свойства не требуется обязательно определять перед использованием. Также как и для класса Model, от Expando необходимо определить класс-наследник, который задает тип объектов данных.

Класс Expando является потомком класса Model и наследует или перекрывает все его методы.

Параметры:

parent
Экземпляр модели или ключа типа Key для объекта, который будет выступать родительским по отношению к создаваемому.
key_name

Имя нового объекта. Имя становится частью его первичного ключа. Если задано None, то для ключа используется заданный системой числовой идентификатор.

Значение параметра key_name не должно начинаться с цифры и не может быть вида __*__. Если приложение использует для задания имен ключей объектов введенные пользователем данные (например, адрес электронной почты), то оно должно привести их к допустимому виду, к примеру, добавив в ним префикс, заранее удовлетворяющий системным требованиям.

Значение параметра key_name сохраняется в качестве юникод строки (с конвертацией из типа str).

**kw
Первичные значения свойств экземпляра модели, заданные именованными параметрами. Каждый параметр должен совпадать с атрибутом нового объекта и может соответствовать либо статическому, либо динамическому свойству.