2009-10-23 30 views
2

在開始有些尷尬之後,我的冒險實體組繼續(請參閱Under some circumstances an App Engine get_by_key_name call using an existing key_name returns None)。使用get_by_key_name(Python)獲取App Engine中的子實體列表

我現在看到我無法對正常的get_by_key_name調用一個實體列表,這些子實體具有多個父實體。作爲模型文檔說,

的多個實體由一個 (get_by_key_name)調用請求都必須有 相同的父。

我得到了到做類似下面的習慣:

# Model just has the basic properties 
entities = Model.get_by_key_name(key_names) 
# ContentModel has all the text and blob properties for Model 
content_entities = ContentModel.get_by_key_name(content_key_names) 

for entity, content_entity in zip(entities, content_entities): 
# do some stuff 

現在ContentModel實體模型實體的孩子,這不會因爲單親要求工作。

使用實體組啓用上述場景的一種簡單方法是能夠將一個父母列表傳遞給get_by_key_name調用,但我猜測這是目前不可行的一個很好的理由。我想知道這是否是一個硬性規則(因爲這樣的調用絕對沒有辦法工作),或者可能修改db模塊以便這種類型的調用可以工作,即使這意味着更大的CPU費用。

我也很想看看別人是如何完成這類任務的。我可以想到一些處理它的方法,比如使用GQL查詢,但我不能想到方法調用get_by_key_name的性能。

回答

4

只需創建一個密鑰列表並進行操作即可。

entities = Model.get_by_key_name(key_names) 
content_keys = [db.Key.from_path('Model', name, 'ContentModel', name) 
       for name in key_names] 
content_entities = ContentModel.get(content_keys) 

請注意,我假設每個ContentModel實體的key_name與其父模型相同。 (對於1:1的關係,重用key_name是有意義的。)

+0

好主意。我幾乎沒有使用db.Key.from_path。 – jamtoday 2009-10-23 19:00:45

+0

您可能對[棧交換建議](http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2「代碼審查」)感興趣。它幾乎準備好開始測試,只需要更多。 – greatwolf 2011-01-19 05:08:14

1

我很尷尬地說限制('必須在同一個實體組中)實際上不再適用於這種情況。請隨時給file一個文檔錯誤!

在任何情況下,get_by_key_name只是get的語法糖,如Bill Katz所示。您可以更進一步,甚至可以在鍵列表上使用db.get來一次性獲取所有內容 - db.get不關心模型類型。

+0

如果您獲取多個子實體並嘗試傳遞父級列表,則會返回BadArgumentError,因爲它不會接受密鑰列表。 所以,除非你能傳遞父鍵的列表,否則似乎限制仍然存在。 – jamtoday 2009-10-23 19:06:31

+0

家長名單?不,那顯然不起作用 - 你需要構造關鍵對象並在它們上使用db.get()。我沒有意識到你正試圖獲得兒童實體。 – 2009-10-23 23:04:04

相關問題