如何通过密钥或密钥过滤Python for Google App Engine中的查询?

时间:2011-02-08 23:26:06

标签: python google-app-engine google-cloud-datastore gqlquery

我有一个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 个答案:

答案 0 :(得分:3)

虽然可以按键过滤 - 请参阅@ dplouffe的回答 - 这不是一个好主意。 'IN'子句为子句中的每个项执行一个查询,因此您最终会执行与键一样多的查询,这是实现目标的一种特别低效的方法。

相反,使用批量提取操作,如@Luke文档,然后在代码中过滤掉您不想要的任何元素。

答案 1 :(得分:1)

你无法过滤钥匙。哎呀,我错了。如果已设置索引来处理它,则可以同时过滤键和其他属性。它看起来像这样:

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

您还可以使用get系列方法按密钥,密钥ID或密钥名称查找多个模型。

# 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

如果您需要过滤某些属性以及密钥,则必须分两步完成。通过密钥获取并检查属性,或查询属性并验证密钥。

以下是抓取后过滤的示例。请注意,您不使用Query类的filter方法。而只是过滤列表。

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

filtered = itertools.ifilter(lambda x: x.foo == 'bar', models)

答案 2 :(得分: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')])

答案 3 :(得分:0)

查看:https://developers.google.com/appengine/docs/python/ndb/entities?hl=de#multiple

list_of_entities = ndb.get_multi(list_of_keys)