2013-04-17 90 views
2

我將如何着手獲取基於屬性實體的Datastore實體?我是否必須經過多步過濾器()get()過程?或者我可以通過1件get()來完成這個任務嗎?GAE - 按屬性獲取()實體?

例如,讓我們說我有數據存儲模型頻道:

class Channel(db.Model): 
    name = db.StringProperty(required = True) 

現在,如果我要刪除基於它的名稱的頻道,我怎麼會做這樣的事情:

name = "ch1" 
channel = Channel.get("name = " name) 
channel.delete() 

這獲取聲明不起作用。實現這個的實際方法是什麼?非常感謝!

回答

1

這是根據財產

q = db.Query(Channel) 
q.filter("name =", name) 
entities = q.fetch(100) # The number of entities you want to be returned 
if entries:  
    db.delete(entries) 
+0

有道理。但是沒有像get()那樣返回第一個實體版本呢?你必須返回一個迭代器,即使它只有一個實體? – golmschenk

+0

查詢,返回一個迭代,你必須使用get_by_id()或[get_by_key_name()](https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_get_by_key_name)。如果您確定該名稱對於每個頻道都是唯一的,則可以將其作爲實體的key_name進行分配。 – topless

+0

@golmschenk是的,你也可以使用get()。 – aschmid00

1

如果你這樣做,你怎麼可以檢索一個實體,你最好稍微改變你的設計。如果您按名稱獲取頻道,那麼將頻道的名稱用作關鍵字名稱會更容易(且更快且更便宜)。

創建實體(從docs借來的例子)時,只需通過key_name參數:

employee = Employee(key_name='asalieri', 
       first_name='Antonio', 
       last_name='Salieri') 

而且通過把它拿來與

k = Key.from_path('Employee', 'asalieri') 

一旦你有鑰匙,所有操作可照常進行。

0

如果名稱字段唯一標識一個實體,最好使用它作爲Sudhir提及的關鍵字。然而,如果存在具有相同名稱的多個實體,你需要給他們取第一

all = Channel.all(keys_only=True).fetch(1000) # only need key to delete 
db.delete(all) 

一個行版本

db.delete(Channel.all(keys_only=True).fetch(1000))