GAE NDB如何获取用户数据并放回数据库

时间:2014-04-02 09:19:58

标签: python google-app-engine database-design app-engine-ndb

我最近在Google App Engine上从ext.db切换到了NDB.model,而且对数据库来说还是比较新的。下面是新的NDB代码,它与ext.db大致相同。

我想要做的是当用户尝试登录时,检查是否存在uid。如果是这样,则将数据从数据库传回“条目”。如果uid不存在,则从Json中提取数据并填充新的“条目”。

class User(ndb.Model):
    uid             = ndb.StringProperty(required = True)
    firstName       = ndb.StringProperty(required = True)
    lastName        = ndb.StringProperty(required = True)
    emailAddress    = ndb.StringProperty(required = True)
    password        = ndb.StringProperty(required = True)
    created         = ndb.DateTimeProperty(auto_now_add = True)
    last_modified   = ndb.DateTimeProperty(auto_now = True)

    @classmethod
    def addUser(cls, info):
        entry = User.query().filter(Profile.uid == info['uid']).get        
        #USED TO BE FOR DB: entry = User.all().filter('uid = ', info['uid']).get()
        # if the profile doesn't exist, create it with basic information
        if entry == None:
            entry = User(uid = info["id"], 
                     firstName = info["firstName"], 
                     lastName = info["lastName"], 
                     emailAddress = info["emailAddress"], 
                     password = info[passwd])
        # At this point, we have a valid entry.
        entry.last_modified = datetime.now()
        entry.put()
        return entry

此代码不起作用。我试过了entry = User.query().filter(Profile.uid == info['uid']).get,但我收到了属性错误

  

AttributeError:'instancemethod'对象没有属性'last_modified'

我为无法澄清更多而道歉,但我被困住了。我错过了什么?一切都运行良好的ext.db(注意我在上面的代码中注意到我改变了),但我看不出NDB有什么问题。我也在寻求改进,所以请提出修改建议。

非常感谢任何帮助!谢谢。

3 个答案:

答案 0 :(得分:1)

此行是您的问题

entry = User.query().filter(Profile.uid == info['uid']).get  

您没有调用该方法,只是将其分配给条目。

答案 1 :(得分:1)

如果你是我将使用:

entry = User.query(Profile.uid == info['uid']).get()

而不是:

entry = User.query().filter(Profile.uid == info['uid']).get

您可以直接在由昏迷分隔的查询声明中指定过滤器。不要忘记最后的括号,否则你做一个函数指针。

答案 2 :(得分:0)

@ndb.transactional
def my_get_or_insert(cls, id, **kwds):
  entry = cls.query().filter(Profile.uid == info['uid']).get  
  if not entry:
    entry = cls(**kwds)
  entry.last_modified = datetime.now()
  entry.put()
  return (entry, True)  # True meaning "created"

Transactional - 以避免脏数据库操作

kwrds =  {'uid': info["id"], 
                     'firstName' : info["firstName"], 
                     'lastName' : info["lastName"], .....

}