3

更新:经过进一步测试,这个问题似乎影响了我的实体组中的所有子实体。所有这些不同实例的根父级是用户类型,这是我自己创建的,而不是内置的用户类型。从子 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() 的参数,但这也不起作用。

  • Login 类型的键名都以“l”(即小写“L”)为前缀,否则都是小写的,可能包含下划线或破折号,但小于 500 个字节。

  • 其他种类的 serches 喜欢这项工作。

  • 关键是 Login 类型的 2 个属性的插值,我可以使用常规 .filter() 方法很好地获取对象
  • 实例的“父级”是一个用户类。(提到以防这对我必须获取的方式有影响)

所以我不得不问,是否有任何明显的原因导致这不起作用?使用 SDK 进行键名搜索的任何已知问题?

4

1 回答 1

3

你的第二条评论是正确的,AFAIK。父/子关系类似于文件系统中的目录或文件夹结构。你的关键是(概念上)/parents/[parent_keyname]/logins/[login_keyname]。因此,如果您尝试获取/logins/[login_keyname],您将无法获得您的实体。(没有规定所有Logins 都必须是Parents 的子级;每次都必须告知 `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)(嗯,我的方法名称更短,但只是说清楚。那么至少我不可能生成具有错误父/子关系的键。

于 2010-02-02T03:30:02.587 回答