为什么model具有key_name没有google-app-engine上的key().id()

zjm*_*126 3 python google-app-engine key

如果我使用这个:

class A(db.Model):
    a=db.StringProperty()

class demo(BaseRequestHandler):
    def get(self):
        a=A()
        a.a='sss'
        a.put()
        raise Exception(a.key().id())
Run Code Online (Sandbox Code Playgroud)

我可以得到a.key().id()是961

但如果我添加key_name ="aaa",则a.key().id()将为None:

class A(db.Model):
    a=db.StringProperty()

class demo(BaseRequestHandler):
    def get(self):
        a=A(key_name="aaa")
        a.a='sss'
        a.put()
        raise Exception(a.key().id())
Run Code Online (Sandbox Code Playgroud)

那么当我设置key_name时,如何获得key().id()

谢谢

Dre*_*ars 6

你不能,因为他们是一回事.

实体具有编码的字符串键加上整数ID或字符串名称的事实可能会给出误导性的印象,即引用实体的各种方式是重叠的或冗余的.他们不是.

密钥名称就像文件系统中的文件名.ID就像系统自动选择的文件名.密钥本身就像文件的完整路径,包括目录.

考虑Key.from_path方法:

k = Key.from_path('User', 'Boris', 'Address', 9876)

kind=User&name=Boris就像一个目录,kind=Address&name=9876就像一个包含你的实体的文件.返回的密钥只是路径的编码版本.

App Engine依赖于每个实体都有一个固定的,不可变的路径,ergo一键.如果实体可以由用户指定的名称系统分配的ID表示,则这意味着具有n个祖先的单个实体可以具有2 ^(n + 1)个不同的路径和密钥.