我最近在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有什么问题。我也在寻求改进,所以请提出修改建议。
非常感谢任何帮助!谢谢。
答案 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"], .....
}