通常,对于给定对象,最好是针对多个查询执行单个查询。假设我有一堆“儿子”物品,每个物品都有一个“父亲”。我得到了所有'儿子'对象:
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。
我这样做了吗?
答案 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值 实体存在相应的密钥。