2013-04-17 58 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))