2012-04-17 66 views
0

我有一個名爲Request的模型。請求與父用戶創建的,像這樣:在Google App Engine中從祖先路徑生成密鑰

request = Request(parentUserKey) 

現在,對於用戶的KEY_NAME是用戶的電子郵件,所以當我創建一個新用戶,我做的:

user = User(key_name = '[email protected]') 

那麼什麼我想現在要做的就是創建一個使用Key.from_path的請求的關鍵,所以我嘗試:

requestKey = Key.from_path('User', '[email protected]', 'Request', 1) 

我把1,因爲我會用此鍵來獲取ID爲高於1的所有請求(或任何其他任意int)通過以下方式:

requestQuery.filter("__key__ >", requestKey)

然後用於測試目的,我嘗試通過keyString = str(requestKey)的鍵轉換爲字符串,但我得到了以下錯誤:

Cannot string encode an incomplete key

我在做什麼錯?

+0

是0有效嗎? – dragonx 2012-04-17 03:10:04

回答

2

要詳細說明Guido寫了些什麼,做所有這些工作來手動創建密鑰可能不是解決問題的最佳方法。相反,如果將所有用戶的請求實體存儲在用戶的實體組中,則可以簡單地直接使用祖先查詢檢索它們。

首先,讓所有用戶的請求實體孩子,我們要稍微改變,你實例化一個Request對象的方式:

request = Request(parent=parentUser) # Where parentuser is a User already in the datastore 
# Do whatever else you need to do to initialize this entity 
request.put() 

現在,讓所有的請求的對象是屬於用戶,您剛:

requests = Request.all().ancestor(parentUser).fetch(1000) 
# Obviously, you want to intelligently manage the condition of having 
# more that 1000 Requests using cursors if need be. 

不必手動創建使用所有的路徑信息的大鑰匙的能力,但它也比需要往往更多的工作。

這是否解決您的使用情況?

1

帶0的密鑰無效。而不是那個過濾器,使用祖先查詢。

+0

0是任意的。爲了這個問題,我只是把它放在那裏。我會將其更改爲1 – Snowman 2012-04-17 11:43:46

+0

雖然0和1之間有很大差異。用0,str(key)將引發一個異常,並引用你所引用的消息。用1,它將返回一個有效的編碼密鑰。 – 2012-04-17 17:55:23

相關問題