Google Appengine:奇怪的get_by_key_name行为

时间:2010-02-01 18:59:06

标签: google-app-engine entity-groups

更新:进一步测试后,似乎此问题会影响我的实体组中的所有子实体。我所有这些不同实例的根父级是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())

一些注意事项:

  • 我只在SDK中测试过
  • l.key()。name()当我查看数据存储时,返回与实体一起列出的键名字符串。我可以从数据故事中复制并粘贴字符串,并将其用作get_by_key_name()的arg,但也不起作用。

  • 登录类型的键名都以“l”为前缀(即小写“L”),并且全部为小写,可以包含下划线或短划线,但不超过500字节。

  • 像这样的其他类似的工作。

  • 关键是对Login类的2个属性的插值,我可以使用常规.filter()方法获取对象
  • 实例的“父”是User类。 (如果这与我必须取的方式有关,请提及)

所以我不得不问,是否有任何明显的原因导致这种情况无效?使用SDK进行密钥名称搜索的任何已知问题?

1 个答案:

答案 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)(嗯,我的方法名称较短,但只是说清楚。然后至少我不可能生成一个错误的父/子关系的密钥。