Franz Noel
Franz Noel

Reputation: 1900

Query for repeated ndb.KeyProperty not working

What's wrong with my query?

Here are my models:

class Positions(ndb.Model):
  title = ndb.StringProperty(indexed=True)
  summary = ndb.TextProperty()
  duties = ndb.TextProperty()
  dateCreated = ndb.DateTimeProperty(auto_now_add=True)
  dateUpdated = ndb.DateTimeProperty(auto_now=True)

class Applicants(ndb.Model):
  name = ndb.StringProperty(indexed=True)
  position = ndb.KeyProperty(kind=Positions,repeated=True)
  file = ndb.BlobKeyProperty()
  dateCreated = ndb.DateTimeProperty(auto_now_add=True)
  dateUpdated = ndb.DateTimeProperty(auto_now=True)

Here is my query:

class AdminPositionInfoHandler(BaseHandler):
  def get(self,positionKeyId):
    user = users.get_current_user()
    if users.is_current_user_admin():
      positionKey = ndb.Key('Positions',int(positionKeyId))
      position = positionKey.get()
      applicants = Applicants.query(position=position.key).fetch() # the query
      values = {
        'position': position,
        'applicants': applicants,
      }
      self.render_html('admin-position-info.html',values)
    else:
      self.redirect(users.create_login_url(self.request.uri))

What seems to be wrong in using the query:

applicants = Applicants.query(position=position.key).fetch()

I got this error:

File "C:\xampp\htdocs\angelstouch\main.py", line 212, in get
applicants = Applicants.query(position=position.key).fetch()
... 
TypeError: __init__() got an unexpected keyword argument 'position'

I also tried using positionKey instead of position.key:

applicants = Applicants.query(position=positionKey).fetch()

I got this from "Ancestor Queries" section of GAE site:

https://developers.google.com/appengine/docs/python/ndb/queries

Upvotes: 1

Views: 1401

Answers (1)

Greg
Greg

Reputation: 10360

You don't pass arguments to query like that - ndb uses overridden equality/inequality operators, so you can express queries more 'naturally', with '==', '<', '>' etc., so:

applicants = Applicants.query(Applications.position==position.key).fetch()

The section in the on Filtering by Property Values gives some more examples.

(ancestor is a special-case for queries - it isn't a model property)

Upvotes: 4

Related Questions