Когда Expando Class следует использовать в Google App Engine Apps? - PullRequest
6 голосов
/ 25 октября 2010

Какие приложения для Google App Engine Expando Class ?И с чем это связано?

1 Ответ

3 голосов
/ 25 октября 2010

Два распространенных использования Expandos - это частично фиксированные схемы и удаление старых свойств.

Я часто использую Expando, когда у меня есть вид, которому требуются немного другие свойства для разных сущностей;другими словами, когда мне нужна «частично» динамическая схема.Одним из вариантов использования является приложение, которое принимает заказы, когда некоторые продукты являются жидкими (например, вода), некоторые являются физическими единицами (например, DVD), а некоторые являются «другими» (например, мука).Некоторые поля, такие как код товара, цена и количество, всегда нужны.Но что делать, если также необходимы сведения о том, как рассчитывается количество?

Обычно решением с фиксированной схемой является добавление свойства для всех переменных, которые мы можем использовать: вес, измерение, до и после весовнашего склада и так далее.Это отстой.Для каждой сущности большинство других полей не нужны.

class Order(db.Model):
    # These fields are always needed.
    item_code = db.StringProperty()
    unit_of_measure = db.StringProperty()
    unit_price = db.FloatProperty()
    quantity = db.FloatProperty()

    # These fields are used depending on the unit of measure.
    weight = db.FloatProperty()
    volume = db.FloatProperty()
    stock_start_weight = db.FloatProperty()
    stock_end_weight = db.FloatProperty()

С Expando мы можем сделать намного лучше.Мы могли бы использовать unit_of_measure, чтобы сказать нам, как мы вычислили количество.Функции, которые вычисляют количество, могут устанавливать динамические поля, а функции, которые читают информацию этого метода, знают, что искать.Кроме того, у сущности нет группы ненужных свойств.

class Order(db.Expando):
    # Every instance has these fields.
    item_code = db.StringProperty()
    unit_of_measure = db.StringProperty()
    unit_price = db.FloatProperty()
    quantity = db.FloatProperty()


def compute_gallons(entity, kilograms, kg_per_gallon):
    # Set the fixed fields.
    entity.unit_of_measure = 'GAL'
    entity.quantity = kilograms / kg_per_gallon

    # Set the gallon specific fields:
    entity.weight = kilograms
    entity.density = kg_per_gallon

Вы можете достичь аналогичного результата, используя свойство text или blob и сериализовав для него диктовку «другого» значения.Expando в основном «автоматизирует» это для вас.

...