2009-10-23 31 views
2

在开始有些尴尬之后,我的冒险实体组继续(请参阅Under some circumstances an App Engine get_by_key_name call using an existing key_name returns None)。使用get_by_key_name(Python)获取App Engine中的子实体列表

我现在看到我无法对正常的get_by_key_name调用一个实体列表,这些子实体具有多个父实体。作为模型文档说,

的多个实体由一个 (get_by_key_name)调用请求都必须有 相同的父。

我得到了到做类似下面的习惯:

# Model just has the basic properties 
entities = Model.get_by_key_name(key_names) 
# ContentModel has all the text and blob properties for Model 
content_entities = ContentModel.get_by_key_name(content_key_names) 

for entity, content_entity in zip(entities, content_entities): 
# do some stuff 

现在ContentModel实体模型实体的孩子,这不会因为单亲要求工作。

使用实体组启用上述场景的一种简单方法是能够将一个父母列表传递给get_by_key_name调用,但我猜测这是目前不可行的一个很好的理由。我想知道这是否是一个硬性规则(因为这样的调用绝对没有办法工作),或者可能修改db模块以便这种类型的调用可以工作,即使这意味着更大的CPU费用。

我也很想看看别人是如何完成这类任务的。我可以想到一些处理它的方法,比如使用GQL查询,但我不能想到方法调用get_by_key_name的性能。

回答

4

只需创建一个密钥列表并进行操作即可。

entities = Model.get_by_key_name(key_names) 
content_keys = [db.Key.from_path('Model', name, 'ContentModel', name) 
       for name in key_names] 
content_entities = ContentModel.get(content_keys) 

请注意,我假设每个ContentModel实体的key_name与其父模型相同。 (对于1:1的关系,重用key_name是有意义的。)

+0

好主意。我几乎没有使用db.Key.from_path。 – jamtoday 2009-10-23 19:00:45

+0

您可能对[栈交换建议](http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2“代码审查”)感兴趣。它几乎准备好开始测试,只需要更多。 – greatwolf 2011-01-19 05:08:14

1

我很尴尬地说限制('必须在同一个实体组中)实际上不再适用于这种情况。请随时给file一个文档错误!

在任何情况下,get_by_key_name只是get的语法糖,如Bill Katz所示。您可以更进一步,甚至可以在键列表上使用db.get来一次性获取所有内容 - db.get不关心模型类型。

+0

如果您获取多个子实体并尝试传递父级列表,则会返回BadArgumentError,因为它不会接受密钥列表。 所以,除非你能传递父键的列表,否则似乎限制仍然存在。 – jamtoday 2009-10-23 19:06:31

+0

家长名单?不,那显然不起作用 - 你需要构造关键对象并在它们上使用db.get()。我没有意识到你正试图获得儿童实体。 – 2009-10-23 23:04:04

相关问题