NDB查询构建器无法按预期工作

时间:2016-11-19 06:07:52

标签: python google-app-engine google-cloud-datastore app-engine-ndb dev-appserver

我的应用程序中有以下查询

query = cls.query().filter(cls.taskgroup_id == taskgroup_id, cls.availability == True, cls.task_id > min_task_id).order(cls.task_id) query.fetch(1)

以上工作正常如预期。 (仅获取与taskgroup_id匹配且可用的实体,以及task_id> min_task_id)

然而,当我将查询分解为多个语句时。

query = cls.query()
query.filter(cls.taskgroup_id == taskgroup_id)
query.filter(cls.availability == True)
query.filter(cls.task_id > min_task_id)

它没有按预期工作。

当我运行[2]时,查询形成分解为多个语句,它返回一个实体,其可用性为False,task_id等于min_task_id。

[2]没有按预期工作(或者我预期的那样)。我认为这里有用户错误。想知道它是什么。

1 个答案:

答案 0 :(得分:2)

来自Filtering by Property Values(强调我的):

query1 = Account.query()  # Retrieve all Account entitites
query2 = query1.filter(Account.userid >= 40)  # Filter on userid >= 40
query3 = query2.filter(Account.userid < 50)  # Filter on userid < 50 too
     

[...]

     

而不是在单个表达式中指定整个查询过滤器,   您可能会发现按步骤构建它更方便:例如:

     

appengine/standard/ndb/queries/snippets.py

query3
     

query相当于之前的query2变量   例。 注意查询对象是不可变的,所以构造   query1不会影响query3query1的构建   不会影响query2query.filter()

换句话说,对于您的示例,query语句中没有一个实际修改{{1}}。

只需将语句的结果分配给局部变量,然后使用它们,就像在引用的示例中一样。