Google App Engine Expando Classのアプリケーションは何ですか? また、それに関連する優れた実践とは何ですか?
1 に答える
Expandos の 2 つの一般的な用途は、部分的に修正されたスキーマと古いプロパティの削除です。
エンティティ間でわずかに異なるプロパティを必要とする種類がある場合、Expando をよく使用します。つまり、「部分的に」動的なスキーマが必要な場合です。ユースケースの 1 つは、一部の製品が液体 (水など)、一部が物理単位 (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 プロパティを使用し、それに「その他」の値の dict をシリアル化することで、同様の結果を得ることができます。Expando は基本的にそれを「自動化」します。