为什么我的key_name值不是我设置的?

时间:2014-03-21 05:02:29

标签: google-app-engine python-2.7

首先,我对Google App Engine比较陌生,所以我可能会做些傻事。

我希望在模型用户

中将用户名设置为键
class User(db.Model):
#username is key
    password = db.StringProperty(required = True) 
    type = db.StringProperty(required = True)
    approved = db.BooleanProperty(required = True)

要插入我这样做

user = User(key_name = self.request.get('username'), password = password, type = type, approved = False)
user.put()

我相信当你手动设置key_name时,它应该正是你设置的那样但当我查询用户模块时

users = db.GqlQuery("SELECT * FROM User")
for(user in users):
    self.response.write(user.key())

I got the output as agxkZXZ-dmhvc3RlbDNyEQsSBFVzZXIiB2JodXNoYW4M

请有人帮忙!!

2 个答案:

答案 0 :(得分:2)

首先,您应该阅读关键课程https://developers.google.com/appengine/docs/python/datastore/keyclass上的文档以及结构化关键字 - https://developers.google.com/appengine/docs/python/datastore/#Python_Kinds_keys_and_identifiers

任何解决您问题的方法,请注意self.response.write(user.key())的输出为您提供了正确行为的字符串agxkZXZ-dmhvc3RlbDNyEQsSBFVzZXIiB2JodXNoYW4M

这是密钥的URL安全形式,它对构成密钥的所有工件进行编码。

这意味着您可以往返

user.key() = db.Key(encoded=str(user.key())

这允许您将密钥用作URL的一部分。这是否明智是另一种讨论。

如果您只想显示用作key_name的名称,那么Key类的文档会向您显示方法name()将返回名称。

user.key().name()中一样,或者您可以使用id_or_name方法,这意味着顾名思义。

答案 1 :(得分:0)

或许self.request.get('username')返回Null或None,这导致数据存储生成默认条目。根据{{​​3}}文档,它可能需要users.get_current_user().nickname()。按Users Service检查值。

Tim说你使用user.key().name()从密钥中检索名称。