将父级分配给现有实体

时间:2011-07-26 15:30:50

标签: google-app-engine google-cloud-datastore

我有一个已经填充了实体的数据存储区。但是,它们并没有被安排到实体组(例如,亲子关系)。我的实体种类是:

team = Team.get_by_key_name('Plants')
query = Plants.all()

plants尚未分配给Plants小组:

query = Plants.all().ancestor(team)
plants = query.fetch(50)
# This will result in an empty list

我想立即将它们分配给团队:

query = Plants.all()
plants = query.fetch(50)

for p in plants:
  # This isn't right
  p.parent = team

db.put(plants)

当我尝试根据ancestor再次查询时:

query = Plants.all().ancestor(team)
plants = query.fetch(50)
# This still results in an empty list

问题:如何将父级分配给现有实体?

1 个答案:

答案 0 :(得分:4)

根据我的经验,最简单的方法是创建一个复制了所有完全相同信息的新实体,并在这个新实体上适当地设置父实体。

这是因为父项成为实体键的一部分(因此您需要将任何现有父项传递给db.Keyget_by_key_name等,以使它们正常工作),因此它不可更改以你描述的方式(或至少,据我所知)。

编辑: Xion提出了一个我忘记提及的好点。使用新对象替换上一个对象时,还必须处理可能指向旧对象的任何ReferencePropertyListProperty(db.Key)。我想这一天的教训是在放下任何数据之前更仔细地设计和思考实体组。