2013-12-22 51 views
1

我有两个类:如何检查GAE NDB中的记录是否存在?

class User(ndb.Model): # key is user's email 
    phone = ndb.IntegerProperty(indexed=False) 
    ... 

class Question(ndb.Model): 
    user = ndb.KeyProperty(kind=User) 
    ... 

,并使用下面的代码对用户的问题,添加到数据存储:

q = Question() 
... 
user = User.get_by_id(email) 
if user: 
    q.user = ndb.Key(User, email) 

(问题可能由未知用户加入)

我做它正确吗?我应该以某种方式优化代码(使用keys_only?)以减少读取/写入NDB操作的数量?

+0

我想你是对的。既然你基于用户的电子邮件是关键,那么你只能使用密钥。其他那些我在这里看不到任何优化。 –

+0

@JimmyKane,当我做'get_by_id'不会返回(=读取)整个实体? –

+0

是的。所以只能放在那里。 –

回答

0

用户是否已经登录?如果是,那么你可以将用户密钥存储在会话中并省略get_by_id。

除此之外,get_by_id非常高效,但如果用户实体很大,您应该考虑将其拆分(因为提取较小的实体更便宜)。关于get_by_id的另一个很酷的事情是,它将首先使用memcache,如果实体不在memcache中,则使用数据存储。如果用户询问很多问题,那么实体可能会在memcache中。