更新:进一步测试后,似乎此问题会影响我的实体组中的所有子实体。我所有这些不同实例的根父级是User kind,这是我自己的创建,而不是内置的User类型。从子Kind的构造函数中删除parent = user后,get_by_key_name按预期工作。但是,如果可能的话,我希望能够使用实体组功能以及已定义的密钥。
- 嗨, 我试图在我的GAE项目中使用定义的密钥名称来加快查询速度。
然而,我遇到了一个奇怪的问题,我无法获取它们的密钥。此代码似乎不起作用:
for l in Logins.all().fetch():
print Login.get_by_key_name(l.key().name())
一些注意事项:
l.key()。name()当我查看数据存储时,返回与实体一起列出的键名字符串。我可以从数据故事中复制并粘贴字符串,并将其用作get_by_key_name()的arg,但也不起作用。
登录类型的键名都以“l”为前缀(即小写“L”),并且全部为小写,可以包含下划线或短划线,但不超过500字节。
像这样的其他类似的工作。
所以我不得不问,是否有任何明显的原因导致这种情况无效?使用SDK进行密钥名称搜索的任何已知问题?
答案 0 :(得分:3)
你的第二条评论是正确的,AFAIK。父/子关系类似于文件系统中的目录或文件夹结构。您的密钥是(概念上)/parents/[parent_keyname]/logins/[login_keyname]
。因此,如果您尝试获取/logins/[login_keyname]
,则无法获得您的实体。 (没有规则所有Login
必须是Parent
s的子项;每次都必须告诉`get_by_key_name()父关系。)
在我自己的代码中,我最终使用Key.from_path()
构建了自己的密钥。我使用类方法,例如Login.key_for_name(some_parent, some_name)
以及Login.get_by_key_name_for_parent(some_parent, some_name)
(嗯,我的方法名称较短,但只是说清楚。然后至少我不可能生成一个错误的父/子关系的密钥。