这是关于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)如何使用get_by_id()
获取member1?
答案 0 :(得分: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()