2011-07-26 38 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

相關問題