2012-05-20 35 views
4

在這個頁面:https://developers.google.com/appengine/docs/python/datastore/keyclass#Key_from_pathKey.from_path:在App Engine數據存儲文檔混淆Python代碼

這一部分:

Key.from_path(實物,id_or_name,父爲無,命名空間=無,* * kwds) 從一個或多個實體鍵的祖先路徑構建一個新的Key對象。

路徑表示實體的父子關係的層次結構。路徑中的每個實體都表示實體的種類,以及其數字ID或其鍵名稱。完整路徑代表最後出現在路徑中的實體,其祖先(父母)作爲先前的實體。

例如,下面的呼叫創建了一種地址的實體與所述數字ID 9876的父是一種用戶與指定鍵「鮑里斯」的實體的鍵:

ķ = Key.from_path('User','Boris','Address',9876)

有關路徑的更多信息,請參閱鍵和實體組。

函數調用和解釋在這裏沒有意義,如果Address是「kind」參數,它應該先行嗎? ID 9876應該排在第二位?他們爲什麼是第三和第四?
「parent」是第三個參數,爲什麼這裏有兩個「父」參數(類型'User'和名稱'Boris'),它們是參數列表中的第一個和第二個參數?

+1

看起來像基於解釋的Key.from_path(parent_kind,parent,entity_kind,entity),似乎並不真正匹配top上的函數簽名.. – Junuxx

+0

這是構建密鑰的另一種方法,兩者都是有效的。但是你的看法是正確的,因爲該頁面上的文字需要更正。 – alex

+0

完全同意 - 這個例子與解釋不一致。 –

回答

2

AppEngine中的密鑰是分層的,可以獲得一個完整的密鑰,您需要傳遞所有的祖先信息。

在示例中有兩種對象類型:用戶和地址,用戶是地址的父親。 對from_path的調用首先提供其ID爲Boris(id可以是字符串名稱或整數id)的對象類型User,該對象具有類型Address的子對象,其ID爲9876.

+0

所以這個函數調用所指的實體是id 9876種'地址'?那麼,「父」參數是什麼,我們在前面的參數中傳遞關於其祖先的所有內容,對吧? – perfwill

+0

@perfwill是實體ID是9876,但沒有父參數是無意義的。 –

+1

@perfwill被引用的實體的全部密鑰是「User:Boris/Address:9876」 - 密鑰是分層的。如果您已有父鍵,則'parent'參數提供了指定分層鍵的備用方法。 –

2

Gae source code開始,所述Key類的from_path靜態方法的簽名是:

def from_path(*args, **kwds): 

接受在(kind, id or name, kind, id or name, etc. etc.)形式的非零偶數的位置參數:

if not args or len(args) % 2: 
    raise datastore_errors.BadArgumentError(
     'A non-zero even number of positional arguments is required ' 
     '(kind, id or name, kind, id or name, ...); received %s' % repr(args)) 

正如文檔中所述,完整路徑表示路徑中最後出現的實體,其祖先(父母)作爲前面的實體。

所以這個例子似乎是正確的;所創建的關鍵是實體種地址與id 9876具有「鮑里斯」作爲key name用戶的父密鑰。