2

我有一个query,我可以filters毫无问题地申请它们。这工作正常:

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

但是,如果我想通过key键或键列表过滤查询怎么办?

我将它们作为Key()财产或作为 astring并且通过尝试这样的事情,它不起作用:

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

4 回答 4

3

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

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

于 2011-02-09T02:56:10.353 回答
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 回答
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在该实体的列表中获得一个。

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

这是获取后过滤的示例。请注意,您不使用 Query 类的filter方法。相反,只需过滤列表。

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

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

Have a look at: 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 回答