2013-01-14 40 views
1

我將一個NDB密鑰()與一個父節點傳遞給一個延遲函數。在這個函數中,我再次檢索實體。但我不能使用傳遞的鍵直接獲取實體。我必須改變ndb.Key()中的鍵順序配對。如何傳遞一個父節點的NDB密鑰並用它來獲取實體

deferred.defer(my_deferred.a_function, entity.key) 

的entity.key()看起來像:

Key('Parents', 'my_parent', 'Childs', 'my_child') # the first pair is the parent? 

my_deferred.py:

def a_function(key) : 

    entity = ndb.Key(key) # the pass entity.key does not work !!!!! 

給予例外:ValueError異常:鍵()必須有偶數個位置參數。

entity = ndb.Key('Childs', key.id(), parent = key.parent()).get() # this one works fine 

我不明白爲什麼entity.key()方法不給我一個密鑰,我可以直接使用?還是有另一種方法來獲得實體,而不用「更改」密鑰。而且我不明白ValueError的含義。

更新:感謝格雷戈裏

entity = key.get() # works fine 

回答

2

第一,回答你的代碼的具體問題,正確地傳遞密鑰,它不是一個調用的:

deferred.defer(my_deferred.a_function, entity.key)

接下來,實際代碼本身的設計,還有一些需要調整的東西。

  • 延期的api序列化您的代碼,因此實際上不需要從數據存儲中重新查詢實體。如果你堅持這樣做,將entity.key傳遞給延遲方法,它已經是ndb.Key的一個實例,所以不需要構造一個新的Key對象。
+0

Tahnks爲您的答案。對不起,我錯誤地在我的問題(不是在我的代碼中)entity.key()並將其更改爲entity.key。我曾經讀過:不要將實體傳遞給任務。但是如果我通過鑰匙,只有鑰匙。當我傳遞entity.key時,我不能直接使用密鑰,因爲第一對密鑰持有父節點。 – voscausa

+0

再次閱讀您的答案。我試過:key.get()。是的,這工作正常,謝謝! – voscausa

+0

不用擔心,很高興幫助:) –

0

我無法測試,現在這個權利,但怎麼樣:

entity = ndb.Key(*key.flat()) 

Key構造函數接受了幾個不同種類的輸入,並自從flat()Returns a tuple of flattened kind and id values (kind1, id1, kind2, id2, ...).,拆包元組應該通過必要的輸入。每相同的鏈接,這也應該工作:

entity = ndb.Key(pairs=key.pairs()) 
+0

儘管這有效,但這樣做是無意義的。他已經有了鑰匙,所以不需要建造一個新鑰匙。 – bossylobster

+0

@bossylobster真的,感覺有點時髦 - 我投了其他答案無論如何:) – RocketDonkey

+0

問題是:我有密鑰,但我必須從此密鑰創建一個新的密鑰,因爲密鑰不被接受。 – voscausa

相關問題