2013-10-02 64 views
0

對不起noobster問題。如何檢查單個實體的存在? Google App Engine,Python

但我想在這裏做一些非常容易的事情,我不知道如何。文檔給我提示哪些不起作用或適用。

我收到一個POST請求並從中獲取一個變量。它說「名字」。

我必須搜索遍及我的實體對象(例如)並找出是否有一個具有相同名稱的對象。有沒有,我必須用這個名稱創建一個新的實體。容易看起來,但我一直在失敗。 真的很感激任何幫助。

我的代碼目前是這樣的一個:

objects_qry = Object.query(Object.name == data["name"]) 

     if (not objects_qry): 
      obj = Object() 
      obj .name = data["name"] 
      obj .put() 

class Object(ndb.Model): 
    name  = ndb.StringProperty() 
+0

如果你想爲一個給定名稱的唯一密鑰,只有一個實體,你爲什麼不使用「名」,以創建爲實體按鍵,只是使用對象。 get_by_id() –

+0

但我需要通過數據庫中的所有現有對象。或者我只是不明白你的建議。你能給我一些代碼嗎? – momijigari

+0

當你使用這段代碼時,究竟出了什麼問題? –

回答

4

使用查詢來執行此操作實際上是效率低下的。

此外,您的代碼可能不可靠,如果名稱不存在,並且您同時有兩個請求名稱,則最終可能包含兩條記錄。而且你不能說,因爲你的查詢只返回name屬性等於某個值的第一個實體。

因爲您期望只有一個實體名稱查詢是昂貴和低效的。 所以你有兩個選擇你可以使用get_or_insert或者只是做一個get,如果你現在有價值創建一個新的實體。

這裏的任何方法都是使用名稱作爲密鑰一部分的幾個代碼示例。

name = data['name'] 
entity = Object.get_or_insert(name) 

entity = Object.get_by_id(name) 
if not entity: 
    entity = Object(id=name) 
    entity.put() 
2

調用.query只是創建一個查詢對象,它不執行,所以嘗試評估作爲一個布爾值,是錯誤的。查詢對象具有方法fetchget,它們分別返回匹配實體的列表或僅一個實體。

所以,你的代碼可以重寫:

objects_qry = Object.query(Object.name == data["name"]) 
existing_object = objects_qry.get() 

if not existing_object: 
    obj = Object() 
    obj.name = data["name"] 
    obj.put() 

也就是說,蒂姆在如何使用,而不是一個性質的ID的評論點是有道理的,如果你真的在乎名字是唯一的 - 上面的代碼不會停止創建具有相同名稱的實體的兩個同時請求。

+0

非常感謝!你是對的。 – momijigari

+0

但是,你用「使用ID」激動人心的意思是什麼? – momijigari

+0

我以前的小GAE項目是當我想創建一個實體時創建的。編輯=編輯(key_name ='_編輯'),然後我只是通過key_name檢索它。但目前我使用ndb.Model,我猜它沒有key_name屬性。 – momijigari

相關問題