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

sot*_*ips 7 python google-app-engine google-cloud-datastore

通常,对于给定对象,最好对单个查询与许多查询进行比较.假设我有一堆"儿子"物品,每个物品都有一个"父亲".我得到了所有'儿子'对象:

sons = Son.all()
Run Code Online (Sandbox Code Playgroud)

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

father_keys = {}
for son in sons:
    father_keys.setdefault(son.father.key(), None)
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

fathers = Father.get(father_keys.keys())
Run Code Online (Sandbox Code Playgroud)

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

我这样做了吗?

Ale*_*lli 10

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

但是,请参阅第2929行:方法get_value_for_datastore 确实完全符合您的要求!

具体来说,而不是son.father.key(),使用Son.father.get_value_for_datastore(son),你应该高兴的结果;-).