Два распространенных использования 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 в основном «автоматизирует» это для вас.