0

ポリモデル クラスと NBD クラスを結合しようとしています。これを行うための「最善の」方法を明確にするための助けは、次の問題を考えると素晴らしいでしょう。

私は果物のポリモデルを持っています ( Fruit -> Tree-Bearing -> Apples -> Granny Smith- ポリモデル階層の例として)、それをダイエットと呼ばれる ndb.Model に保存したいと思います。明らかに、果物のカテゴリ、野菜のカテゴリなどがあります。これはどのように構築する必要がありますか?

これまでのところ、私は持っています:

class Diet(ndb.Model):
    nameOfDiet = ndb.StringProperty()
    fruit = ndb.StructuredProperty(Fruit)
    vegetable = ndb.StructuredProperty(Vegetable)

これに関する問題 - 私が正しく読んでいると思うように、ダイエットの果物と野菜のオブジェクトは「クエリ不可」です。私は明らかに、ユーザーが自分の特定の果物に一致する食事を検索できるようにしたいと考えています. また、ndb のキャッシング機能も利用したいと考えています。すべてのグラニースミスダイエットが必要な場合に、値が「なし」のダイエットを返さずに取得できるように、フルーツを効率的にクエリするにはどうすればよいでしょうか。さらに、NDB でポリ モデルを実行することはまったく可能ですか? そうでない場合、果物の構造を A) 必要なものに一致させ、B) 少なくとも名目上は効率的にするにはどうすればよいでしょうか?

本当にありがとう!ジョン

4

1 に答える 1

3

この場合、ポリモデルを使用する必要はないと思います。果物の階層を含む、果物のリスト プロパティを使用できます。

class Diet(ndb.Model):
    name = ndb.StringProperty()
    fruit = ndb.StringProperty(repeated=True)
    vegetable = ndb.StringProperty(repeated=True)

果物のプロパティには ['Tree-Bearing', 'Apples', 'Granny Smith', 'Tree-Bearing', 'Apples', 'Golden Delicious', 'Tree-Bearing', 'Oranges'] を含めることができます。次に、「りんご」を含むダイエットを見つけたい場合は、次のようにします。

results = Diet.query(Diet.fruit == 'Apples').fetch(20)

または、「リンゴ」と「オレンジ」を含む食事を検索する場合は、IN クエリを使用できます。

results = Diet.query(Diet.fruit.IN(['Apples', 'Oranges'])

各果物についてさらに詳細が必要な場合 (糖度、季節など)、果物のモデルを作成できます。key_name は果物の名前です (果物に関するデータをすばやく取得できるようにするため)。フルーツ)。必要に応じて、果物モデルに親の階層を含めることができます。

class Fruit(ndb.Model):
    name = ndb.StringProperty()
    sugar_content = ndb.FloatProperty()

したがって、「ゴールデン デリシャス」の詳細を取得するには、キーを作成してデータを取得します。データのフェッチは、Map 関数を使用して非同期的に行うことができます。キーによる取得でもデータがキャッシュされるため、以降の取得は memcache から直接行われます。

gd =ndb.Key("Fruit", "Golden Delicious").get()

もう 1 つのオプション: Fruit オブジェクトを構造化されたプロパティとして (現在行っているように) 保存しますが、構造化されたプロパティを繰り返します。

class Diet(ndb.Model):
    name = ndb.StringProperty()
    fruit = ndb.StructuredProperty(Fruit, repeated=True)

クエリは、ダイエット モデルの構造化プロパティに対して同様の方法で実行できます。

results = Diet.query(Diet.fruit.name == 'Orange')

最後に、ndb ではポリモデルが可能です。https ://developers.google.com/appengine/docs/python/ndb/polymodelclass を参照してください。

データを非同期で取得する方法については、https ://developers.google.com/appengine/docs/python/ndb/async を参照してください。

于 2012-09-02T09:14:32.260 に答える