2012-04-25 5 views
0

Я поместил _post_put_hook в один из моих типов моделей NDB, так что когда всякий раз, когда объект этого типа был помещен, он недействил бы ключ memcache. Этот ключ состоит из версии ключа настроек urlsafe. Тем не менее, при выполнении этого кода, он говорит, что это:Объект KeyProperty не имеет атрибута get

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\rpc.py", line 68, in get 
    result = func(*args) 
    File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\rpc.py", line 154, in pub_refreshSandbox 
    team_key = s.create.team("Cool Group") 
    File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\GlobalUtilities.py", line 534, in team 
    new_team.put() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 2902, in _put 
    return self._put_async(**ctx_options).get_result() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 320, in get_result 
    self.check_success() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 315, in check_success 
    self.wait() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 299, in wait 
    if not ev.run1(): 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\eventloop.py", line 219, in run1 
    delay = self.run0() 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\eventloop.py", line 181, in run0 
    callback(*args, **kwds) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 454, in _on_future_completion 
    self._help_tasklet_along(gen, val) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 368, in _help_tasklet_along 
    self.set_result(result) 
    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 264, in set_result 
    callback(*args, **kwds) 
    File "U:\Hefner\Dropbox\Public\Projects\GHI\dev\DataModels.py", line 182, in _post_put_hook 
    tools.expireCache('allteams-' + self.settings.get().websafe) 
AttributeError: 'KeyProperty' object has no attribute 'get' 

Вот соответствующая модель класса:

class Team(ndb.Expando): 
    name = ndb.StringProperty() 
    show_team = ndb.BooleanProperty() 
    settings = ndb.KeyProperty() 

    @classmethod 
    def _post_put_hook(self, future): 
     memcache.delete('allteams-' + self.settings.get().websafe) 

Идеи?

ответ

2

В этом случае self.settings - это не фактический ключ, а свойство Models, потому что это метод класса, а не метод экземпляра. вам нужно работать над будущим объектом.
здесь документы: https://developers.google.com/appengine/docs/python/ndb/futureclass

в этом случае:

@classmethod 
def _post_put_hook(self, future): 
    entitykey = future.get_result() 
    entity = entitykey.get() 
    memcache.delete('allteams-' + entity.settings.get().websafe) 

не уверен, что websafe делает для вас. может быть, вы имеете в виду entity.settings.urlsafe()?

+0

Это сработало! Благодарю. К сожалению, websafe - это просто свойство, которое я добавил, которое возвращает key.urlsafe(). Я хотел вставить ключи в веб-шаблон, но я не думаю, что вы можете вызывать функции внутри шаблона. Во всяком случае, неважно. – rhefner1

+0

ОК, я вижу, в этом случае его лучше вызвать entity.settings.urlsafe(), потому что вы сохраняете вызовы rpc, и код будет работать быстрее. вы можете вызывать функции на некоторых языках шаблонов, но не в других. поэтому он зависит от того, какой язык вы используете. – aschmid00

Смежные вопросы