访问相关对象键而不在App Engine中获取对象

时间:2010-01-16 02:10:20

标签: python google-app-engine google-cloud-datastore

通常,对于给定对象,最好是针对多个查询执行单个查询。假设我有一堆“儿子”物品,每个物品都有一个“父亲”。我得到了所有'儿子'对象:

sons = Son.all()

然后,我想让那群儿子的所有父亲。我这样做:

father_keys = {}
for son in sons:
    father_keys.setdefault(son.father.key(), None)

然后我可以做:

fathers = Father.get(father_keys.keys())

现在,假设son.father.key()实际上并没有获取对象。我错了吗?我有一堆代码假设object.related_object.key()实际上没有从数据存储区中获取related_object。

我这样做了吗?

2 个答案:

答案 0 :(得分:10)

您可以通过在下载App Engine SDK源代码时研究appengine.ext.db的来源找到答案 - 答案是,不,没有您需要的特殊外壳:{{1} {<1}}描述符的方法(1.3.0 SDK的源代码中的第2887行)在之前调用,知道以后是否会在结果上调用__get__或其他任何内容,所以它没有机会进行你想要的优化。

然而,请参阅第2929行:方法ReferenceProperty 确实完全符合您的要求!

具体而言,使用.key()代替get_value_for_datastore,结果你应该更快乐; - )。

答案 1 :(得分:1)

我宁愿遍历儿子并使用son.parent_key()获取父母的密钥。

  

<强> parent_key()

     

返回此实例的父实体的Key,如果是,则返回None   此实例没有父级。

Since all the path is saved in the instance's key理论上,无需再次访问数据库即可获取父级密钥。

之后,可以使用db.get()立即让所有家长的实例

  

获取(键)

     

获取任何Model的给定键的一个或多个实体。

     

参数:

     

键   密钥对象或密钥对象列表

     

如果提供了一个Key,则返回值是该实例   适当的Model类,如果没有则为None   实体与给定的密钥一起存在。如果一个   提供密钥列表,返回   value是相应的模型列表   实例,没有时为None值   实体存在相应的密钥。