谷歌应用引擎的ndb:使用ID或密钥名称?

Ran*_*ang 9 google-app-engine

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

模型:

class Member(ndb.Model):
  ...
Run Code Online (Sandbox Code Playgroud)

程序:

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

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

<input ... name="id" value={{member1.key.id}} ... />
Run Code Online (Sandbox Code Playgroud)

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

Member.get_by_id(self.request.get('id'))
member1 = Member.get_by_id(int(self.request.get('id')))
Run Code Online (Sandbox Code Playgroud)

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

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

将适用于member2.

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

som*_*ne1 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()
Run Code Online (Sandbox Code Playgroud)

  • 感谢您确认我的一些观察结果.经过更多的实验,我得出以下结论.如果创建的实体没有id(例如,`member1 = Member()`),那么它的ID是一个整数,可以通过`member1 = Member.get_by_id(int(self.request.get('id'))获取)`.但是,如果使用id创建实体(例如,`member2 = Member(id ='abc')`),那么它的Key Name是'abc',它可以由`member2 = Member.get_by_id(self)获取.request.get( 'ID'))`.它们都在HTML中使用相同的模板变量:`{{member1.key.id}}和{{member2.key.id}}` (3认同)