Запрос к хранилищу данных GAE

Я пытаюсь перечислить всех пользователей, которые введены в мое хранилище данных в моем тестовом приложении 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)

person user2463758    schedule 24.06.2013    source источник


Ответы (1)


В отличие от базовой версии 'db', модели NDB не используют all() для запросов, они используют query(), поэтому

self.query = User.query()

документы NDB по запросам могут оказаться полезными.

Кроме того, использование self настолько часто, насколько это возможно, немного необычно; помимо вызовов self.response.write и self.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>')
person Greg    schedule 24.06.2013
comment
Большое спасибо @Greg за такой ясный и полезный ответ! Я использовал учебник для написания запросов, и они использовали self в своем коде, поэтому я взял его из него, поскольку я предполагал, что это необходимо. Я вытащу их. Я изменил свой метод публикации на приведенный ниже код, но теперь я получаю сообщение об ошибке, говорящее, что query = User.query() UnboundLocalError: локальная переменная «Пользователь», на которую ссылается перед назначением. Я думал, что запрос действовал на класс пользователя? Мой код сейчас: - person user2463758; 25.06.2013
comment
def post(self): query = User.query() self.response.write('‹html›‹body›‹h1›Search username‹/h1›') для пользователя в запросе: self.response.write('‹ p›%s‹/p›' % User.db_username) self.response.write('‹/body›‹/html›') - person user2463758; 25.06.2013
comment
Попробуйте переименовать свою переменную в «user» — возможно, она конфликтует с классом User. - person Greg; 25.06.2013
comment
По какой-то причине я не могу отформатировать этот пост как код, поэтому я разместил ссылку на скриншот, чтобы было понятнее snag.gy/zZGVB.jpg - person user2463758; 25.06.2013
comment
Пробовал с пользователем, пользователем1 и пользователем, и каждый раз выдает одну и ту же ошибку. Ему не нравится строка, которая говорит query = User.query(), по-видимому. - person user2463758; 25.06.2013