2013-10-05 5 views
0

Мой код предназначен для:GqlQuery по идентификатору всегда возвращает None результат

  • Извлечение user_id из печенья, если он существует.
  • Запросить хранилище данных, используя user_id для извлечения пользовательской записи.
  • И наконец, если запись найдена, отображается приветственное сообщение. (регистрация заносится на шаблон)

Я не могу заставить приложение отображать приветственное сообщение. Насколько я могу судить, проблема в том, что запрос всегда возвращает None. Я проверил файл cookie, и данные в хранилище данных существуют.

Что я делаю неправильно с этим запросом? Является ли дескриптор GQL в тех случаях, когда клаузулы не интуитивно понятны?

#Get cookie   
user_id = self.request.cookies.get("user_id", 0) 

#Query Datastore for matching user_id 
user = db.GqlQuery("SELECT * FROM User WHERE id = %s" % user_id).get() 

#If a user is found, display the username 
if user.username: 
    signup = "Welcome, %s" % user.username 

ответ

1

Датастор имеет Key свойство, которое состоит из (по желанию), предков вида, и имя или идентификатор. Однако нет специального свойства id. (Reference)

Чтобы получить объект с определенным ключом, код должен выглядеть примерно так:

# Get cookie   
user_id = self.request.cookies.get("user_id", 0) 

if not user_id: 
    # handle this case, otherwise the call to from_path will fail. 

# Build key 
user_key = db.Key.from_path('User', long(user_id)) 

# Get the entity 
user = db.get(user_key) 

# If a user is found, display the username 
if user.username: 
    signup = "Welcome, %s" % user.username 

Вы на самом деле не хотите использовать запрос, в данном случае, потому что вы уже знаете, ключ компании, которую вы ищете.

Когда вы запрашиваете с ключами, вы должны указать весь ключ (не только ID):

user = db.GqlQuery("SELECT * FROM User WHERE __key__ > KEY('User', %s)" % user_id).get() 

Обратите внимание, здесь я использую неравенство, так как с помощью фильтра равенства для ключа не с учетом того, что вы можете сделать прямой поиск. Here является эталонным для использования KEY в строке GQL и я процитировал соответствующий раздел ниже:

Правая рука сравнения может быть один из следующих (в соответствии с типом данных отеля) :

  • ключ объект буквальным, либо струнный кодированный ключ или полный путь видов и ключевых имен/идентификаторов:

    • KEY('encoded key')

    • KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])

+0

Итак, я уже получил эту несколько работающих с использованием метода get_by_id пользователя = User.get_by_id (Int (user_id)), но был запущен в ошибку, когда cookie не существует. Этот код также вызывает эту ошибку. Это связано с значением по умолчанию, которое я использую, когда cookie user_id не существует user_id = self.request.cookies.get («user_id», 0). Оказывается, метод from_path() не принимает 0 для аргумента id_or_name. Из документации Google App Engine: идентификатор, указанный как строка или длинный. Это не может быть число 0. – Hess

+0

Ах да, вы совершенно правы - пропавший куки-файл сломает его.Я продолжу и отредактирую код, чтобы другие люди не сталкивались с одной и той же проблемой. –

Смежные вопросы