Google app engine 什么时候应该在Google应用程序引擎应用程序中使用Expando类?

Google app engine 什么时候应该在Google应用程序引擎应用程序中使用Expando类?,google-app-engine,expando,Google App Engine,Expando,谷歌应用程序引擎有哪些应用程序? 与之相关的良好实践是什么?Expandos的两个常见用途是部分固定的模式和旧属性 class Order(db.Expando): # Every instance has these fields. item_code = db.StringProperty() unit_of_measure = db.StringProperty() unit_price = db.FloatProperty() quantity =

谷歌应用程序引擎有哪些应用程序?
与之相关的良好实践是什么?

Expandos的两个常见用途是部分固定的模式和旧属性

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
我经常使用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,我们可以做得更好。我们可以使用度量单位来告诉我们如何计算数量。计算数量的函数可以设置动态字段,读取该方法信息的函数知道要查找什么。而且,实体没有一堆不需要的属性

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属性并将“other”值的dict序列化给它,可以获得类似的结果。Expando基本上为您“自动化”了它。

在您概述的情况下,另一个选择是使用PolyModel;但是您可能会创建和导入大量的模型来处理变化(对于这种类型的示例)。我处理的是液体,有很多(我们的应用程序使用了大约12种)计算体积的方法。这是Expando模型最简洁的原因总结之一。谢谢