Python 使用嵌套和/或在Google App Engine中执行祖先查询

Python 使用嵌套和/或在Google App Engine中执行祖先查询,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我正在使用Google App Engine NDB,并尝试执行以下查询: query = Club.query(ndb.OR( ndb.AND(Club.memberIds == userId, Club.modifiedDate > date), ndb.AND(Club.activityDate > date, ancestor = userKey) )) 但是,我得到一个运行时错误: TypeError: __new__() got an unexpected keywo

我正在使用Google App Engine NDB,并尝试执行以下查询:

query = Club.query(ndb.OR(
ndb.AND(Club.memberIds == userId, Club.modifiedDate > date), 
ndb.AND(Club.activityDate > date, ancestor = userKey)
))
但是,我得到一个运行时错误:

TypeError: __new__() got an unexpected keyword argument 'ancestor'
它与祖先的位置有关。在一个例子中,我们能够指出解决方案,但是这个解决方案在这里不适用,因为祖先在实际AND子句中

  • 如何重新格式化此查询才能正常工作
  • 这是个坏主意吗?是不是太复杂了?由于它的复杂性,我会花费比平时更多的阅读费用吗

  • 是否可以重写查询以使用GQL

    编辑

    否决我自己的建议。不可能重写查询以使用GQL。GQL不支持

    见:

    建议 如果还将祖先对象修改为模型属性,则可以执行所需的查询。例如

    class Club(ndb.Model):
        parent = ndb.KeyProperty()
    

    不能将祖先用作筛选器的一部分;它必须是query()调用中直接使用的关键字参数。目前,OR查询已转换为多个查询,因此OR()方法的唯一好处是更容易组合结果。但要实现这一点,您必须按键排序,编写一个合并函数来合并按键排序的两组查询结果是很简单的。(也可以通过调用ndb.query来实现这一点。_MultiQuery()但后者不是一个有文档记录的API,很难正确实现,因此最好自己完成。)

    但我只想将其添加到查询的第二部分,而不是第一部分。所以我想要
    或者(query1without祖先,query2with祖先)
    是的,我改变了我的建议。我不清楚你是否需要祖先。祖先通常用于建议数据的位置(即建议appengine将该日期存储在同一磁盘上)。这对于为事务处理对数据执行锁定是必要的。这就是你需要的吗?是的,那可能行。我试图对我执行的查询数量小心谨慎,所以我想我可以将它们与and和ORS组合成一个查询,而不是运行两个查询。但显然,我上面的查询运行了两个查询,对吗?我不确定。但是,一般来说,运行查询比获取数据然后自己执行过滤要好。我怀疑祖先必须是query()的参数,而不是and()