Не удается воспроизвести эту ошибку на локальном 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)
Любая идея, что здесь происходит?
Как я мог видеть, вы создаете объект пользователя и сохраняете это в 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()
Это происходит потому, что созданный объект User
имеет соответствующий адрес электронной почты, но не соответствующий идентификатор пользователя (поскольку он не имеет его) и, следовательно, не отображается как совпадение в результатах запроса. Существует несколько проблем с вашим текущим подходом:
В общем, запрос на свойство пользователя опасен и может привести к таким проблемам. Я бы рекомендовал поместить свойство user_id пользователя в строку и вместо этого запросить это.
Синтаксис фильтра неверен. Вам нужно показать оператор (в данном случае, '=').
projs = Project.all().filter('created_by =', user).fetch(500)