Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中为Google App Engine按键过滤查询?_Python_Google App Engine_Google Cloud Datastore_Gqlquery - Fatal编程技术网

如何在Python中为Google App Engine按键过滤查询?

如何在Python中为Google App Engine按键过滤查询?,python,google-app-engine,google-cloud-datastore,gqlquery,Python,Google App Engine,Google Cloud Datastore,Gqlquery,我有一个查询,我可以毫无问题地申请。这很好: query.filter('foo =', 'bar') 但是,如果我想按键或键列表筛选查询,该怎么办 我将它们作为Key()属性或作为string使用,但通过尝试这样的操作,它没有起作用: query.filter('key =', 'some_key') #no success query.filter('key IN', ['key1', 'key2']) #no success 不能对密钥进行筛选。哎呀,我错了。如果设置了索

我有一个
查询
,我可以毫无问题地申请。这很好:

query.filter('foo =', 'bar')
但是,如果我想按
或键列表筛选查询,该怎么办

我将它们作为
Key()
属性或作为
string
使用,但通过尝试这样的操作,它没有起作用:

query.filter('key =', 'some_key')        #no success
query.filter('key IN', ['key1', 'key2']) #no success
不能对密钥进行筛选。哎呀,我错了。如果设置了索引来处理某个键和其他属性,则可以同时对其进行筛选。它看起来是这样的:

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

如果需要对某些属性以及键进行筛选,则必须分两步进行。通过键获取并检查属性,或者查询属性并验证键

下面是一个抓取后过滤的示例。请注意,您没有使用查询类的
filter
方法。而只是过滤列表

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

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

您可以通过如下方式执行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)


虽然可以按键进行过滤(见@dplouffe的答案),但这不是一个好主意IN'子句对子句中的每个项执行一个查询,因此您最终执行的查询数量与键的数量相同,这是实现目标的一种特别低效的方法

相反,请使用批取操作,如@Luke documents,然后从代码列表中筛选出您不想要的任何元素。

请查看:


事实上我也试过。。但在按键列表检索后,我无法
过滤
。当我这样做时:
models=MyModel.get(keys)
models.filter('foo=','bar')
返回一个错误:
AttributeError:'list'对象没有属性'filter'
你能用一个例子更新你的答案吗?在按键检索它们之后我如何过滤?@Lipis你需要在
之前插入
.filter()
()
。请查看我的答案,了解为什么对键进行过滤是个坏主意。谢谢@Luke,这也是我想了解其工作原理的原因。但一般来说,我认为这种方法不起作用。@Jason的可能重复我认为它不重复。。无法解决我的问题。。我可能会扩展我的问题。
result.filte仍然无法使用r('foo=','bar')
在其中任何一种情况下..或以任何其他方式使过滤器成为可能..我不想立即编写整个查询..分步骤进行更简单..因为过滤器的数量未知..我可以在第二步中添加where语句吗?是否可以将
查询中的
\uuuuuuuuuuu键与其他属性上的查询相结合?因此它是b甚至可以使用(正如@Luke所建议的)
models=MyModel.get(Key.from_path(…),…)
然后在代码中进行过滤?或者这就是你所说的获取操作?@Lipis这就是我建议使用的方法。获取操作是可批处理的,比查询更快。但是如果我有很多条目,并且我想以每10个条目的一部分返回它们。我将使用某种循环进行过滤(或者有更聪明的方法吗?)成千上万个可能的条目,我不能保证想要的条目会出现在我的第一次抓取()中……我搞混了吗?@Lipis你是如何获取要抓取的密钥列表的?有点奇怪,你知道你想要获取的确切密钥,但不知道它们是否属于最终结果列表。例如:1000个用户每个都有一个文件(1000个文件)使用相同的标记进行标记。此标记包含一个文件键列表(我正在使用taggable mixin类..可能这是万恶之源..但我想要标记功能..因此我想向特定用户显示具有此标记和belog的文件。。

result = Model.get([db.Key.from_path('Model', 'Key1'), db.Key.from_path('ProModelduct', 'Key2')])
list_of_entities = ndb.get_multi(list_of_keys)