2011-07-26 42 views
0

我有一个已经填充实体的数据存储区。但是,他们还没有被安排到实体组织中(又称亲子关系)。我的实体种类有:将父级分配给现有实体

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 

问题:如何将父项分配给已存在的实体?

+2

简答:您不能 - 在创建时确定父实体。长答案:看华夫饼的答案。 –

回答

4

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

这是因为母公司成为一个实体的键(所以为什么你需要的任何现有父传递给db.Key,或get_by_key_name,等他们正常工作)的一部分,所以它不是在你描述的方式改变的(或至少,不是我所知道的)。

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

+2

请注意,创建新实体将需要更改指向旧的所有“ReferenceProperty”值。 – Xion

+0

另一种方法是确保在创建时将所有新实体分配给父实体,然后更改查询逻辑以执行三件事:1)运行先前使用的查询,2)运行指定祖先的新查询,3)联合两个数据集。只要你的实体是不变的,这提供了很强的一致性。如果您在引入您的父亲设置逻辑之前对实体进行了变异,那么这些变异将不会非常一致。 – tom

相关问题