9

这是关于 Google App Engine 的 ndb。根据我的观察,如果我在不提供任何键的情况下创建实体,则该实体将ID在数据存储查看器中显示的字段中具有一个整数,从 1 开始并且是递增的。但是,如果我通过提供字符串作为其 id 创建实体,则该实体将在Key Name字段中包含一个字符串。例如:

模型:

class Member(ndb.Model):
  ...

程序:

member1 = Member()            # --> ID is 1, Key Name is None
member2 = Member(id='abc')    # --> ID is empty, Key Name is 'abc'

另外,在html文件中,如果我使用

<input ... name="id" value={{member1.key.id}} ... />

作为返回服务器端程序(Python)的参数,以下两条语句均不适用于member1:

Member.get_by_id(self.request.get('id'))
member1 = Member.get_by_id(int(self.request.get('id')))

但是,以下 html 和程序代码:

<input ... name="id" value={{member2.key.id}} ... />
member2 = Member.get_by_id(self.request.get('id'))

将为member2工作。

通过提供字符串 id(即 member2)创建的实体似乎没有问题。但同样不适用于member1。我的问题: a) 我的观察是否正确?b)我如何获取 member1 使用get_by_id()

4

1 回答 1

13

a) 大部分是正确的,尽管您应该能够member1通过您展示的第二种方法。也无法验证整数 ID 是否始终从 1 开始并且始终是递增的。在这方面,我看到了喜忧参半的结果。

b)member1 = Member.get_by_id(int(self.request.get('id')))应该工作

您也可以尝试使用key.urlsafe(),这样您就不必担心密钥 id 转换:

<input ... name="id" value={{member.key.urlsafe()}} ... />

member_key = self.request.get('id')
member = ndb.Key(urlsafe=member_key).get()
于 2013-02-18T14:40:57.460 回答