如何从父实体获取子孙后代

2024-06-16 14:58:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我似乎找不到一个快速的答案,如何让数据存储子体引用父实体。下面是一个简单的例子:

# 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. 我如何使用john或john获取fluffy、rover和facts的密钥?在
  2. 与john(或key)一起,我能否仅根据事实获得密钥/实体(而不是漫游者、毛绒)?在

Tags: 数据答案实体密钥john例子parentperson
2条回答

扩展Adam的答案:如果您不知道fluffyrover或{}的密钥名或密钥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,但是如果它们有名称,则可以用字符串名称代替intid。在

要使用ancestor filter

kid_keys = db.Query(keys_only=True).ancestor(john).fetch(1000)

您可以通过指定事实的类型来获取事实:

^{pr2}$

使用get()而不是fetch()假设john只有一个Details子级。如果这不是真的,请调用fetch来获取所有这些数据。在

相关问题 更多 >