如何从父实体获取后代

时间:2010-08-12 19:02:35

标签: python google-app-engine

我似乎找不到关于如何在给定父实体的引用的情况下获取数据存储后代的快速答案。这是一个简单的例子:

# 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, ...)
  1. 如何使用约翰或约翰的钥匙获得蓬松,流浪者和事实的钥匙?
  2. 使用john(或密钥),我可以得到关键/实体的事实(不是流浪者,蓬松)?

2 个答案:

答案 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的答案:如果您不知道fluffyroverfacts的密钥名称或密钥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即可。