【问题标题】:google app engine ndb successive queriesgoogle app engine ndb 连续查询
【发布时间】:2014-05-06 08:01:07
【问题描述】:

假设我有一个如下的 HTML 表单:

<form ...>
    Title: <input type=text name=title>
    Account: <input type=text name=account>
    <input type=submit value=search>
</form>

google app engine的NDB如下:

class Message(ndb.Model):
    title = ndb.StringProperty()
    account = ndb.StringProperty()

由于用户可能会或可能不会在字段中输入数据,因此搜索将作为连续查询来实现:

messages = Message.query()
if title:
    messages = messages.query(Message.title==title)
if account:
    messages = messages.query(Message.account==account)

上面的代码不起作用,因为“查询对象没有属性查询”

那么,如何执行连续查询?

【问题讨论】:

    标签: python google-app-engine webapp2


    【解决方案1】:

    您是否阅读过有关 ndb 查询的文档。 https://developers.google.com/appengine/docs/python/ndb/queries

    它有一个很好的例子来构建一个多部分的查询

    qry1 = Account.query() # Retrieve all Account entitites
    qry2 = qry1.filter(Account.userid >= 40) # Filter on userid >= 40
    qry3 = qry2.filter(Account.userid < 50) # Filter on userid < 50 as well
    

    在你的例子中你会

    messages = Message.query()
    if title:
        messages = messages.filter(Message.title==title)
    if account:
        messages = messages.filter(Message.account==account)
    

    在问题中的代码中调用 query() 会创建一个新查询,而不是扩展它。

    进一步阅读文档,您会发现您还可以开始使用 OR 运算符分多个阶段构造查询。上面的例子意味着 AND。

    【讨论】:

      【解决方案2】:

      去掉messages = Message.query()这一行,然后使用:

      messages = Message.query(Message.title==title)
      

      【讨论】:

      • account 的下一个查询呢?
      • 再做一次。
      • messages = Message.query(Message.account==account)
      • 不,我希望搜索结果是那些同时匹配 titleaccount 的实体。实际上,我的应用程序中有很多字段要匹配。
      猜你喜欢
      • 1970-01-01
      • 2015-06-27
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多