GqlQuery по ID всегда возвращает результат None
Мой код предназначен для:
- Получить user_id из файла cookie, если он существует.
- Запросите хранилище данных, используя user_id для получения пользовательской записи.
- Наконец, если запись найдена, отображается приветственное сообщение. (регистрация передается в шаблон)
Я не могу заставить приложение отображать приветственное сообщение. Насколько я могу судить, проблема в том, что запрос всегда возвращает None. Я проверил cookie и данные в хранилище данных существуют.
Что я делаю не так с этим запросом? GQL обрабатывает идентификаторы в выражениях where неинтуитивно?
#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, которое состоит из (необязательно) предков, типа и имени или идентификатора. Тем не менее, нет конкретного свойства идентификатора. (Ссылка)
Чтобы получить сущность с определенным ключом, ваш код должен выглядеть примерно так:
# 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
Вы на самом деле не хотите использовать запрос в этом случае, потому что вы уже знаете ключ сущности, которую вы ищете.
Когда вы запрашиваете ключи, вы должны указать весь ключ (а не только идентификатор):
user = db.GqlQuery("SELECT * FROM User WHERE __key__ > KEY('User', %s)" % user_id).get()
Заметьте, что здесь я использую неравенство, поскольку использование фильтра равенства для ключа не имеет смысла, учитывая, что вы можете выполнить прямой поиск. Вот ссылка на использование KEY в строке GQL, и я процитировал соответствующий раздел ниже:
Правая часть сравнения может быть одной из следующих (в зависимости от типа данных свойства):
литерал ключа сущности, со строковым ключом или полным путем видов и имен / идентификаторов ключей:
KEY('encoded key')
KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])