Google app engine 谷歌Appengine:奇怪的按键取名字行为
更新:经过进一步测试,这个问题似乎影响了我的实体组中的所有子实体。所有这些不同实例的根父类都是用户类,这是我自己创建的,而不是内置的用户类。从子类的构造函数中删除parent=user之后,get_by_key_名称按预期工作。但是,如果可能的话,我希望能够将实体组功能与定义的键一起使用 -- 你好 我试图在我的GAE项目中使用已定义的键名进行更快的查询 然而,我遇到了一个奇怪的问题,我无法获取它们的密钥。此代码似乎不起作用:Google app engine 谷歌Appengine:奇怪的按键取名字行为,google-app-engine,entity-groups,Google App Engine,Entity Groups,更新:经过进一步测试,这个问题似乎影响了我的实体组中的所有子实体。所有这些不同实例的根父类都是用户类,这是我自己创建的,而不是内置的用户类。从子类的构造函数中删除parent=user之后,get_by_key_名称按预期工作。但是,如果可能的话,我希望能够将实体组功能与定义的键一起使用 -- 你好 我试图在我的GAE项目中使用已定义的键名进行更快的查询 然而,我遇到了一个奇怪的问题,我无法获取它们的密钥。此代码似乎不起作用: for l in Logins.all().fetch():
for l in Logins.all().fetch():
print Login.get_by_key_name(l.key().name())
一些注意事项:
- 我只在SDK中进行了测试
- l、 key().name()返回在数据存储中查找时与实体一起列出的键名称字符串。我可以复制并粘贴数据故事中的字符串,并将其用作参数,以通过_key_name()获取_,但这也不起作用
- 登录类的键名都以“l”(即小写的“l”)作为前缀,其他方面都是小写的,可能包含下划线或破折号,但不超过500字节
- 其他种类的像这样的工作
- 键是登录类型的两个属性的插值,我可以使用常规的.filter()方法很好地获取对象
- 实例的“父”是一个用户类。(如果这与我取回的方式有关,请提及)
所以我不得不问,有没有什么明显的原因可以解释为什么这样做行不通?使用SDK进行密钥名称搜索是否存在任何已知问题?您的第二条评论是正确的,您好。父/子关系类似于文件系统中的目录或文件夹结构。您的密钥(概念上)是
/parents/[parent\u keyname]/logins/[login\u keyname]
。因此,如果您试图获取/logins/[login\u keyname]
,您将无法获取您的实体。(没有规则规定所有登录
s都必须是父项
s的子项;每次都必须告诉'get_by_key_name()。)
在我自己的代码中,我最终使用
Key.from_path()
构建了我的密钥。我使用类方法,例如,Login.key\u表示\u名称(一些\u父项,一些\u名称)
以及Login.get\u by\u key\u名称\u表示\u父项(一些\u父项,一些\u名称)
(好吧,我的方法名较短,但只是说得很清楚。那么至少我不可能生成具有错误父/子关系的密钥。我想这是一个已知的问题。但是,很难判断这是否仅仅是SDK的问题,或者它是否也会影响生产?附带说明,如果我将父参数添加到get_by_key_name(key_name,parent)也很好用。它应该是这样工作的吗?谢谢你的回答。我昨天终于发现了这个问题。我对为什么在Child.get_by_key_name()中需要家长的逻辑感到困惑
。但是,正如您所说,父项的密钥在某种程度上是子项密钥的一部分,因此您需要了解父项以构建子项密钥。到目前为止,这非常有效,除了子实体内容的永久链接。我可能不得不在这方面受到性能影响。