我有一个query
,我可以毫无问题地对它们应用filters
。这很好用:
query.filter('foo =', 'bar')
但是如果我想通过key
或按键列表过滤我的查询呢?
我将它们作为Key()
属性或作为string
并通过尝试这样的方式,它不起作用:
query.filter('key =', 'some_key') #no success
query.filter('key IN', ['key1', 'key2']) #no success
答案 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)