使用get_by_key_name获取App Engine中的子实体列表(Python)

时间:2009-10-23 02:41:29

标签: python performance google-app-engine model

我对实体团体的冒险经历了一个稍微尴尬的开始(见Under some circumstances an App Engine get_by_key_name call using an existing key_name returns None)。

我现在看到我无法对具有多个父实体的子实体的实体列表进行正常的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实体是Model实体的子实体,由于单亲要求,这将无效。

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

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

2 个答案:

答案 0 :(得分: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与其父Model相同。 (对于1:1的关系,重用key_name是有意义的。)

答案 1 :(得分:1)

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

无论如何,get_by_key_name只是get的语法糖,正如Bill Katz所说。您甚至可以更进一步,并在密钥列表上使用db.get来一次性获取所有内容 - db.get不关心模型类型。