2013-06-24 176 views
1

我想列出在我的测试GAE应用程序中输入到我的数据存储中的所有用户,并列出每个用户的用户名。然而,当我运行下面的代码,我得到一个错误说GAE数据存储查询

self.query = User.all() AttributeError: type object 'User' has no attribute 'all'

我认为self.query = User.all()将返回所有用户在我的数据库?

我的代码如下。 在此先感谢!

PS。我知道我的用户搜索表单正在询问用户名,并且无所作为,但过滤是以后的任务 - 我只是想确保我已经先完成基本查询。

from google.appengine.ext import ndb 

import webapp2 
import uuid 

class User(ndb.Model): 
    db_UID = ndb.StringProperty(indexed = True) 
    db_username = ndb.StringProperty(indexed = True) 
    db_password = ndb.StringProperty(indexed = True) 
    db_email = ndb.StringProperty(indexed = True) 
    db_resetID = ndb.StringProperty(indexed = True) 


class UsersPage(webapp2.RequestHandler): 
    def get(self): 
    self.response.write('<html><body><h1>User Info Page</h1>') 
    self.response.write(""" 
     <form method = "post"> 
     Username: <input type = "textarea" name = "user_username"></input><br> 
     Password: <input type = "textarea" name = "user_password"></input><br> 
     Email address: <input type = "textarea" name = "user_email"></input><br> 
     <input type = "submit"></input> 
     </form>""") 
    self.response.write('</body></html>') 

def post(self): 
    UNIQUE_ID_STRING = str(uuid.uuid1()) 
    self.user = User(db_UID = UNIQUE_ID_STRING , 
     db_username = self.request.get('user_username'), 
     db_password = self.request.get('user_password'), 
     db_email = self.request.get('user_email')) 
    self.user.put() 
    self.redirect('/user') 



class UserFinder(webapp2.RequestHandler): 
def get(self): 
    self.response.write('<html><body><h1>Search username</h1>') 
    self.response.write(""" 
     <form method = "post"> 
     Username: <input type = "textarea" name = "user_username"></input><br> 
     <input type = "submit"></input> 
     </form>""") 
    self.response.write('</body></html>') 

def post(self): 
    self.query = User.all() 
    self.response.write('<html><body><h1>Search username</h1>') 

    for self.user in self.query: 
     self.response.write('<p>%s</p>' % self.User.db_username) 

    self.response.write('</body></html>') 


application = webapp2.WSGIApplication([ 
('/user', UsersPage), 
('/userfinder', UserFinder), 
], debug = True) 

回答

4

不同于基本 'DB' 的版本,NDB模型不用于查询使用all(),他们使用query(),所以

self.query = User.query() 

NDB docs on queries可能是有用的。

另外,尽量使用self有点不寻常;除了调用self.response.writeself.redirect之外,仅仅使用局部变量将会减少很多混淆(如果您需要发布更多的问题,这样做会更好!),并且可以节省您的输入时间。 因此,您的发布方法将变为:

query = User.all() 
self.response.write('<html><body><h1>Search username</h1>') 

for user in query: 
    self.response.write('<p>%s</p>' % user.db_username) 

self.response.write('</body></html>') 
+0

非常感谢@Greg这样一个清晰而有用的答案!我使用了一个教程来编写查询,他们在自己的代码中使用了自我,所以我从它那里拿了它,因为我认为这是必要的。我会把它们拿出来。 我已经修改我的post方法到下面的代码,但我现在得到一个错误,说 查询= User.query() UnboundLocalError:本地变量'用户'在赋值之前引用。 我认为查询是在User类上作用的? 我的代码是现在: – user2463758

+0

DEF后(个体经营): 查询= User.query() self.response.write( '

搜索用户名

') 用户查询: self.response的。写( '

%S

'%User.db_username) self.response.write('') – user2463758

+0

尝试重命名你的变量 '用户' - 它可能与用户类冲突。 – Greg