TypeError:'Key'对象不可调用

时间:2012-06-30 03:34:43

标签: python google-app-engine google-cloud-datastore

我正在尝试使用python中的以下代码调用Google应用商店中某个实体的特定模型:

class Profile(BlogHandler):
    def get(self):
        user = users.get_current_user()

        if user:
            user = users.get_current_user()
            user_db_qry = User.query(User.theid == user.federated_identity())
            #theid is how I have saved each user's federated id in the User entity in the datastore
            user_db_list = user_db_qry.fetch(1)
            profile_user = user_db_list[0]
            profile_id = profile_user.key().id_or_name()
            #I am trying to get the datastore created ID/Name here and this is the line that gives me the error

            self.redirect('/profile/%s' % str(profile_id))
        else:
            self.redirect("/about")

所以我不太确定会出现什么问题。我的查询不正确吗?

3 个答案:

答案 0 :(得分:4)

前言,我对GAE没有任何经验。此答案完全基于API文档

文档声称只有模型实例具有返回Key classkey()方法。虽然,User class似乎是它自己的实体。

您可以只使用直接方法,而不是尝试访问密钥实例:

profile_id = profile_user.user_id()
profile_nick = profile_user.nickname()

如果您想调查用户的key成员包含的内容,可以通过查看来调试:

print type(profile_user.key)
print dir(profile_user.key)

<强>更新

在您的评论中,您澄清了您使用的NDB variants解释了该问题。 NDB Key Class与数据库Key Class不同。它没有id_or_name()方法。它有什么:

  

id()返回最后一个(kind,id)对中的字符串或整数id,或者   如果密钥不完整则无。

     

string_id()返回最后一个(kind,id)对中的字符串id,或者None   如果密钥有一个整数id或不完整。

     

integer_id()返回最后一个(kind,id)对中的整数id,或者   如果密钥具有字符串ID或不完整,则为无。

答案 1 :(得分:2)

        profile_id = profile_user.key().id_or_name()

不需要第一组parens。

        profile_id = profile_user.key.id_or_name()

答案 2 :(得分:0)

根据您在其他地方写的内容,您是如何为实体分配密钥的?你是不是给他们起名字?

如果您使用的结束路径如下:(注意:我表示父级,只是关键路径)

ndb.Key.from_path(..."User", "harold")

对于您的密钥,然后密钥将为其ID返回None,但 (如果ndbdb的工作方式类似)具有名称属性。

解决这个问题的最简单方法是在SDK中运行您的应用并转到http://localhost:8080/_ah/admin,打开交互式控制台并尝试(可能全部)属性,直到获得所需的属性。使用app引擎,它通常可以帮助捕获奇怪的错误(例如,如果您尝试将它们与kewyord参数一起使用而不是位置参数,则许多API调用特别失败等)

我还建议尝试从您从ndb.Key.from_path()生成的密钥到用户实例进行查找,看看您是否正确实例化/获取/获取密钥。