【问题标题】:GAE Datastore queryGAE 数据存储查询
【发布时间】:2013-06-21 05:49:04
【问题描述】:

我正在尝试列出在我的测试 GAE 应用程序中输入到我的数据存储区的所有用户,并打印出每个用户的用户名。但是,当我运行下面的代码时,我收到一条错误消息

self.query = User.all() AttributeError:类型对象“用户”没有属性“全部”

我以为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)

【问题讨论】:

    标签: google-app-engine datastore


    【解决方案1】:

    与基本的“db”版本不同,NDB 模型不使用all() 进行查询,它们使用query(),所以

    self.query = User.query()
    

    NDB docs on queries 可能有用。

    顺便说一句,尽可能多地使用self 有点不寻常;除了对self.response.writeself.redirect 的调用之外,仅使用局部变量就不会那么混乱(如果您必须发布更多问题,那就太好了!),并且可以节省您的打字时间。 所以你的 post 方法会变成:

    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>')
    

    【讨论】:

    • 非常感谢@Greg 提供了如此清晰而有用的答案!我使用教程来编写查询,他们在代码中使用了 self ,所以我认为这是必要的,所以我从中获取了它。我会把它们拿出来。我已将我的 post 方法修改为下面的代码,但我现在收到一条错误消息,提示 query = User.query() UnboundLocalError: local variable 'User' referenced before assignment。我认为查询是对 User 类起作用的?我的代码现在是:
    • def post(self): query = User.query() self.response.write('

      Search username

      ') for User in query: self.response.write('

      %s

      ' % User.db_username) self.response.write('')
    • 尝试将变量重命名为 'user' - 它可能与 User 类发生冲突。
    • 由于某种原因,我无法将这篇文章格式化为代码,所以我发布了一个指向它的屏幕截图的链接,以使其更清晰snag.gy/zZGVB.jpg
    • 用 user、user1 和 User 尝试过,每次都报同样的错误。它显然不喜欢说 query = User.query() 的那一行
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多