2011-06-05 62 views
8

我想知道獲取使用Model.get_by_key_name()VS Model.get_by_id()GAE型號get_by_id()VS

例如,假設我返回一些JSON將被用來顯示記錄get_by_key_name()一張記錄表,每個記錄都有一個按鈕可以刪除該記錄。假設我有模型'Foo'和模型實例'foo'。

我相信我能使用或者與相應的記錄每個按鈕關聯:

str(foo.key()) #suppose it eval's to "axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM" 

foo.key().id() #suppose it eval's to "57" 

其中一個值將使其進入一個HTML表單,用戶可以點擊使用該鍵/ ID刪除記錄的請求的按鈕。

請求將隨後導致主要是:

Foo.get_by_key_name("axhYm92ZZXJvY2tyDgsSCENhnb3J5GBQM").delete() 

Foo.get_by_id(57).delete() 

現在,作爲猶豫不決困擾的ADHD的程序員,我是,我需要知道......這是「正確的方法?他們都似乎工作,但是在那種情況下,一個人更喜歡另一個?使用'鑰匙'方式和'id'方式有什麼優勢?

回答

11

您正在將密鑰名稱與字符串化的密鑰混淆。他們不同。密鑰的名稱是您在構建時通過保留的key_name屬性給實體的東西。如果你不這樣做,系統會生成一個ID。實體密鑰可以具有名稱或ID,但不能同時擁有兩個名稱。

如果你已經有意串化了一個Key,你可以通過將它傳遞迴Key構造函數來重組它。

stringifiedKey = str(key) 
reconstitutedKey = db.Key(stringifiedKey) 

假設你確實是指名稱與id,這是一個更方便的問題。任何性能差異都將是微觀的。

2

你得到的是一個關鍵字符串而不是key_name。如果你想從它的關鍵字符串中獲得一個對象。然後你使用Model.get(keystring)。 Key_name是你分配給一個被認爲是唯一的對象。如果你認爲你可以使用任何獨特的屬性,你可以把它作爲一個key_name,否則去默認生成的id。只有使用key_name才能得到的結果是get_or_insert(),如果具有該鍵名稱的實體存在,則返回實體,否則返回一個實體並返回該實體。

+0

其實應該是'Model.get(db.Key(keystring))'對嗎? – 2011-06-06 06:06:41

+0

沒有得到()也可以從keystring中得到一個實體Model.get(keystring) – 2011-06-06 06:19:17

+0

噢真的嗎?我查閱了文檔,沒有發現任何提及,但這很好。謝謝。 – 2011-06-07 13:57:02