2011-08-30 52 views
2

我想要做這樣的事情:如何將實體的父級設置爲屬性?

e = Employee(key_name = 'john',name='john the first') 
e.put() 
a = Address(key_name='addr_john',street='66th street') 
a.parent = e; 
a.put(); 

addr = Address.gql("WHERE ANCESTOR IS :1", e).fetch(1) #len(addr)==0 

但它不工作,只是工作,如果我在構造函數中設置父。

a = Address(key_name='addr_john',street='66th street',parent=e) 

但我不想這樣做,我需要在我創建對象後做到這一點。

回答

4

父實體只能在其創建期間設置,因此只能在db.Model子類實例的構造函數中設置。嘗試分配parentdb.Model實例的屬性將導致其parent()函數被覆蓋,但實際的相應數據存儲實體的父項不會被更改。

如果您在創建子對象期間無法建立關係,則應考慮將其編碼爲普通屬性。 或者(如果由於您需要的交易而無法承擔沒有父子關係的情況),您可以嘗試推遲創建子對象,直到您可以確定它應該擁有哪個父對象。由於您顯然也使用父數據(即nameEmployee)爲子實體建立key_name,因此此方法似乎有意義。 (像父母一樣的密鑰名稱也只能在實體創建期間設置)。

+0

謝謝Xion。我想創建一堆對象,它們都是給定ParentObject的子對象。所以我想在這個ParentObject上做put_async,然後創建這些ChildObjects,並且在那之後分配父對象(可能阻塞一點以得到結果)。如此糟糕,無法完成。你知道一些方法來重新分配模型的關鍵嗎?因爲我可以創建密鑰並在發生所有事情後分配給ChildObject。 – santiagobasulto

+0

@santiagobasulto:除非通過創建一個具有相同數據的新實體並刪除舊實體,否則在創建對象之後無法更改對象的密鑰。 – geoffspear

+0

謝謝你們兩位。我將不得不繼續做與我一樣的事情。 – santiagobasulto

相關問題