一般来说,对给定对象执行单个查询比执行多个查询更好。假设我有一堆“儿子”对象,每个对象都有一个“父亲”。我得到了所有“儿子”对象:
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.lated_object.key() 实际上并未从数据存储区获取 related_object 。
我这样做对吗?
通过研究来源就能找到答案appengine.ext.db在您下载的 App Engine SDK 源代码中 - 答案是,不,没有您需要的特殊情况:__get__
方法(1.3.0 SDK 源代码中的第 2887 行)ReferenceProperty
描述符被调用before知道如果.key()
或者稍后将在结果上调用其他任何内容,因此它没有机会进行您想要的优化。
However,参见第 2929 行:方法get_value_for_datastore
does做你想做的事!
具体来说,而不是son.father.key()
, use Son.father.get_value_for_datastore(son)
你应该是much结果更快乐;-)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)