Фильтр запросов не работает, но GQL: ошибка в движке приложения?

1

Не удается воспроизвести эту ошибку на локальном devserver (1.5.0), но когда мы разворачиваем код в google, он начинает появляться? Это ошибка в текущей онлайн-версии GAE?

Вот проблема. Если мы сначала сделаем это:

proj = Project(created_by=users.User(email='[email protected]'))
proj.put()
user = users.get_current_user()
print user.email()  #this prints [email protected] (actual email not used)

Получает 0 результатов:

projs = Project.all().filter('created_by', user).fetch(500)

Но это позволяет получить результат, который должен быть извлечен:

projs = GqlQuery("SELECT * FROM Project where created_by = USER('%s')"%user.email()).fetch(500)

Любая идея, что здесь происходит?

Теги:
google-app-engine

3 ответа

3
Лучший ответ

Как я мог видеть, вы создаете объект пользователя и сохраняете это в created_by. то есть

users.User(email='[email protected]')

здесь вы создаете объект users.User с электронной почтой '[email protected]'. Вы сохраняете то же самое в проектах created_by. Где вы сравниваете это с users.get_current_user(), который получает текущий зарегистрированный пользовательский объект. Вот почему он не выбирает какой-либо объект. Если в gql вы снова создаете объект User с переданным электронным письмом, которое, очевидно, будет соответствовать сохраненному объекту пользователя в проекте.

Я бы сказал, что вы должны сделать что-то вроде этого

proj = Project()
proj.created_by  = users.get_current_user()
proj.put()
user = users.get_current_user()
Project().all().filter('created_by',user).get()
  • 0
    Так можно ли создать пользовательский объект, который соответствует users.get_current_user ()? Если да, то как?
  • 0
    почему вы хотите создать его, когда вы всегда можете получить его, вызвав user.get_current_user ()
Показать ещё 2 комментария
3

Это происходит потому, что созданный объект User имеет соответствующий адрес электронной почты, но не соответствующий идентификатор пользователя (поскольку он не имеет его) и, следовательно, не отображается как совпадение в результатах запроса. Существует несколько проблем с вашим текущим подходом:

  • Адреса электронной почты не гарантируются на прежнем уровне - пользователь может изменить свой адрес электронной почты
  • Адреса электронной почты не гарантируются уникальными - кто-то может потребовать адрес, который освободил другой пользователь.
  • Запрос свойств пользователя соответствует свойствам, отличным от адреса электронной почты

В общем, запрос на свойство пользователя опасен и может привести к таким проблемам. Я бы рекомендовал поместить свойство user_id пользователя в строку и вместо этого запросить это.

  • 0
    Из документов GAE: «Если адрес электронной почты связан с учетной записью Google, user_id возвращает уникальный постоянный идентификатор пользователя, стр. Этот идентификатор всегда одинаков для пользователя независимо от того, меняет ли пользователь свой адрес электронной почты. Если адрес электронной почты не связан с учетной записью Google, user_id возвращает None. " Так что с федеративным логином, что мы должны использовать в запросах?
0

Синтаксис фильтра неверен. Вам нужно показать оператор (в данном случае, '=').

projs = Project.all().filter('created_by =', user).fetch(500)
  • 0
    Но это не объясняет, почему это удается на сервере dev, если только этот сервер более не прощает синтаксиса.
  • 2
    На самом деле это неверно. Из документации фильтра GAE: «Если оператор не указан в строке (аргумент - просто имя свойства), фильтр использует оператор =». Кстати, не работает даже с фильтром равенства.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню