6

Google App Engine Expando Class有哪些应用程序?以及与之相关的良好做法是什么?

4

1 回答 1

3

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 基本上会为您“自动化”。

于 2010-10-25T02:42:48.000 回答