2

私は持っています、そして私は問題なくそれらにquery適用することができます。filtersこれは正常に機能します。

query.filter('foo =', 'bar')

keyしかし、クエリまたはキーのリストでフィルタリングしたい場合はどうなりますか?

私はそれらをKey()プロパティまたはとして持っていますがstring、このようなことを試してみると、うまくいきませんでした:

query.filter('key =', 'some_key')        #no success
query.filter('key IN', ['key1', 'key2']) #no success
4

4 に答える 4

3

キーでフィルタリングすることは可能ですが(@dplouffeの回答を参照)、それは良い考えではありません。'IN'句は、句内の項目ごとに1つのクエリを実行するため、キーと同じ数のクエリを実行することになります。これは、目標を達成するための特に非効率的な方法です。

代わりに、@ Lukeドキュメントのようにバッチフェッチ操作を使用してから、コード内のリストから不要な要素をフィルタリングします。

于 2011-02-09T02:56:10.353 に答える
1

キーでフィルタリングすることはできません。おっと、私はそれについて間違っていました。キーと他のプロパティを同時に処理するようにインデックスを設定している場合は、それをフィルタリングできます。次のようになります。

key = db.Key.from_path('MyModel', 'keyname')
MyModel.all().filter("__key__ =", key).filter('foo = ', 'bar')

また、一連のメソッドを使用して、キー、キーID、またはキー名で多数のモデルを検索することもできますget

# if you have the key already, or can construct it from its path
models = MyModel.get(Key.from_path(...), ...)

# if you have keys with names
models = MyModel.get_by_key_name('asdf', 'xyz', ...)

# if you have keys with IDs
models = MyModel.get_by_id(123, 456, ...)

この方法で多くのエンティティをフェッチできます。正確な制限はわかりません。いずれかのキーが存在しない場合は、Noneそのエンティティのリストにが表示されます。

キーだけでなくいくつかのプロパティでフィルタリングする必要がある場合は、2つのステップでそれを行う必要があります。キーを取得してプロパティを確認するか、プロパティをクエリしてキーを検証します。

フェッチ後のフィルタリングの例を次に示します。filterQueryクラスのメソッドは使用しないことに注意してください。代わりに、リストをフィルタリングするだけです。

models = MyModels.get_by_key_name('asdf', ...)

filtered = itertools.ifilter(lambda x: x.foo == 'bar', models)
于 2011-02-08T23:38:50.007 に答える
1

次のようなGQLクエリを実行することで、クエリをフィルタリングできます。


result = db.GqlQuery('select * from Model where __key__ IN :1', [db.Key.from_path('Model', 'Key1'), db.Key.from_path('Model', 'Key2')]).fetch(2)

また


result = Model.get([db.Key.from_path('Model', 'Key1'), db.Key.from_path('ProModelduct', 'Key2')])
于 2011-02-09T01:26:59.390 に答える
0

ご覧ください:https ://developers.google.com/appengine/docs/python/ndb/entities?hl = de#multiple

list_of_entities = ndb.get_multi(list_of_keys)
于 2014-02-13T17:26:29.797 に答える