Google app engine 将父对象指定给现有实体

Google app engine 将父对象指定给现有实体,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我有一个已经填充了实体的数据存储。然而,它们还没有被安排到实体组中(也称为父子关系)。我的实体类型是: team = Team.get_by_key_name('Plants') query = Plants.all() 工厂尚未分配给工厂团队: query = Plants.all().ancestor(team) plants = query.fetch(50) # This will result in an empty list 我现在想把他们分配给团队: query = Plant

我有一个已经填充了实体的数据存储。然而,它们还没有被安排到实体组中(也称为父子关系)。我的实体类型是:

team = Team.get_by_key_name('Plants')
query = Plants.all()
工厂
尚未分配给
工厂
团队:

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)
当我尝试基于
祖先再次查询时

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

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

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

这是因为父项成为实体密钥的一部分(因此,您需要将任何现有父项传递给
db.key
,或
get\u by\u key\u name
,等等,以使它们正常工作),所以它不能以您描述的方式更改(或者至少,据我所知不是这样)

编辑:
熊提出了一个我忘了提的好观点。用新对象替换以前的对象时,还必须注意可能指向旧对象的任何
ReferenceProperty
ListProperty(db.Key)
。我想今天的课程是在放下任何数据之前更仔细地设计和思考实体组。

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

这是因为父项成为实体密钥的一部分(因此,您需要将任何现有父项传递给
db.key
,或
get\u by\u key\u name
,等等,以使它们正常工作),所以它不能以您描述的方式更改(或者至少,据我所知不是这样)

编辑:
熊提出了一个我忘了提的好观点。用新对象替换以前的对象时,还必须注意可能指向旧对象的任何
ReferenceProperty
ListProperty(db.Key)
。我想今天的教训是在放下任何数据之前更仔细地设计和思考实体组。

注意,创建新实体需要更改所有指向旧实体的“ReferenceProperty”值。另一种方法是确保在创建时为所有新实体分配一个父实体,然后更改查询逻辑以执行三件事:1)运行以前使用的查询,2)运行指定祖先的新查询,3)合并两个数据集。只要实体是不可变的,这就提供了强大的一致性。如果对在引入父设置逻辑之前创建的实体进行变异,则这些变异将不具有强一致性。请注意,创建新实体将需要更改所有指向旧实体的“ReferenceProperty”值。另一种方法是确保为所有新实体分配一个父实体创建时,然后更改查询逻辑以执行三项操作:1)运行以前使用的查询,2)运行指定祖先的新查询,3)合并两个数据集。只要实体是不可变的,这就提供了强大的一致性。如果您对在引入父设置逻辑之前创建的实体进行变异,则这些变异将不具有强一致性。简短回答:您不能-父实体在创建时确定。长答案:请参阅华夫格的答案。短答案:您不能-父实体是在创建时确定的。长答案:参见华夫饼的答案。