我似乎找不到关于如何在给定父实体的引用的情况下获取数据存储后代的快速答案。这是一个简单的例子:
# a person who has pets
john=Person(**kwargs)
# pets
fluffy=Pet(parent=john, ...)
rover=Pet(parent=john, ...)
# lengthy details about john that are accessed infrequently
facts=Details(parent=john, ...)
答案 0 :(得分:1)
您想使用ancestor filter:
kid_keys = db.Query(keys_only=True).ancestor(john).fetch(1000)
你可以通过指定事实的类型来获得事实:
facts_key = db.Query(Details, keys_only=True).ancestor(john).get()
使用get()
代替fetch()
假设约翰只有一个Details
孩子。如果不是这样,请致电fetch
以获取所有内容。
答案 1 :(得分:0)
扩展Adam的答案:如果您不知道fluffy
,rover
或facts
的密钥名称或密钥ID,则无法提前构建密钥仅在john
的实体或键上。你必须使用祖先查询,就像亚当的回答一样。
另一方面,如果您 知道这些子实体的名称或ID(例如,在请求处理程序中,ID作为URL的一部分进入),可以根据john
实体或其密钥构造其密钥。 E.g:
# Build a key for the parent
john_key = db.Key.from_path('Person', 1)
# Build a key for the children
fluffy_key = db.Key.from_path('Pet', 1, parent=john_key)
rover_key = db.Key.from_path('Pet', 2, parent=john_key)
# Get all three at once
john, fluffy, rover = db.get([john_key, fluffy_key, rover_key])
这些示例假设所有实体键都有ID,但如果它们有名称,您只需用字符串名替换int
ID即可。