通常,对于一个给定的对象,最好执行单个查询,而不要执行多个查询。假设我有一堆“儿子”物件,每个物件都有一个“父亲”。我得到了所有的“儿子”对象:
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。
我这样做对吗?
您可以通过下载App Engine SDK来源中的appengine.ext.db来源来找到答案- 答案是,不,没有您需要的特殊框:__get__方法(来源中的第2887行) (对于1.3.0 SDK)ReferenceProperty会 先 描述符的描述符被调用, 然后才 知道是否.key()对结果进行调用,因此就没有机会进行所需的优化。
__get__
ReferenceProperty
.key()
但是 ,请参见第2929行:方法get_value_for_datastore 确实 完成了您想要的!
get_value_for_datastore
具体来说,son.father.key()使用而不是使用Son.father.get_value_for_datastore(son),结果您会 更 快乐;-)。
son.father.key()
Son.father.get_value_for_datastore(son)