python classmethod get_by_user返回None

zer*_*rds 2 python google-app-engine class-method

我在使用类方法示例时需要帮助get_by_user接下来是我对类方法的改编.

class Pages(ndb.Model):
    user_id = ndb.StringProperty()
    name = ndb.StringProperty()

    @classmethod
    def get_by_user(cls, user):
        return cls.query().filter(cls.user_id == user.user_id()).get()
Run Code Online (Sandbox Code Playgroud)

view.py代码是下一个.

class MainPage(BaseHandler):

    def get(self):
    user = users.get_current_user()
    logging.info("MainPageGet: %s " % user)
    if user: #offer user options 
        isUser = True
        user_ID = user
        for p in Pages.query():
        logging.info("MainPageGet p: %s " % p.user_id)
        logging.info("MainPageGet user_ID: %s " % user_ID)
        page = Pages.get_by_user( user_ID) 
        logging.info("MainPageGet page: %s " % page )
Run Code Online (Sandbox Code Playgroud)

我的日志结果如下.

<pre>
INFO     2018-02-10 04:28:21,509 views.py:192] MainPageGet: test@example.com 
INFO     2018-02-10 04:28:21,518 views.py:198] MainPageGet p: test@example.com 
INFO     2018-02-10 04:28:21,519 views.py:198] MainPageGet p: joan@hotmail.com 
INFO     2018-02-10 04:28:21,519 views.py:200] MainPageGet user_ID: test@example.com 
INFO     2018-02-10 04:28:21,524 views.py:204] MainPageGet page: None 
INFO     2018-02-10 04:28:21,535 module.py:812] default: "GET / HTTP/1.1" 200 2284
</pre>
Run Code Online (Sandbox Code Playgroud)

我的示例ndb数据生成如下.

page1 = Pages(id='BS',user_id='test@example.com',name='Brian')
page2 = Pages(id='JS',user_id='joan@hotmail.com',name='Joan')
page1.put()
page2.put()
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,我做错了什么,在最终的记录结果中产生无结果,而不是找到test.example.com结果id='BS'

Dan*_*scu 5

user.user_id()返回的ID,其中,至少开发服务器上是一个数值,像这样的:185804764220139124118.

但是,当您创建Pages实体时,将其user_id属性的值设置为包含电子邮件地址的字符串:user_id='test@example.com'.

因此,内部查询get_by_user()不会返回任何实体,因为没有匹配过滤器.

你可以修改get_by_user()为这样的东西(在这种情况下你可能想调整实际的属性名称,以避免混淆):

    @classmethod
    def get_by_user(cls, user):
        return cls.query().filter(cls.user_id == user.email()).get()
Run Code Online (Sandbox Code Playgroud)