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

时间:2010-07-18 17:44:07

标签: 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())

我可以得到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())

那么当我设置key_name

时,如何获得key()。id()

感谢

1 个答案:

答案 0 :(得分:6)

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

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

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

考虑Key.from_path方法:

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

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

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