Question

Suppose I have an HTML form as follows:

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

The NDB of the google app engine is as follows:

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

Since the user may or may not input data in the fields, the search would be implemented as successive queries:

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

The above code didn't work because "Query object has no attribute query"

So, how do I perform successive queries?

Was it helpful?

Solution

Have you read the docs for ndb queries. https://developers.google.com/appengine/docs/python/ndb/queries

It has a good example of constructing a query in multiple parts

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

In your example you would

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

Calling query() in the code you have in the question creates a new query, rather than extending it.

Read further in the docs, and you can see you can also start using OR operators to construct the query in multiple phases. The example above means AND.

OTHER TIPS

Get rid of the messages = Message.query() line, then use:

messages = Message.query(Message.title==title)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top