查询过滤器不工作,但GQL是:应用程序引擎中的错误?

2024-05-19 20:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

无法在本地devserver(1.5.0)上重现此错误,但当我们将代码部署到google时,它就开始出现了?在线版的GAE是当前的错误吗?在

问题就在这里。如果我们先这样做:

proj = Project(created_by=users.User(email='test@sample.com'))
proj.put()
user = users.get_current_user()
print user.email()  #this prints test@sample.com (actual email not used)

这将获取0个结果:

^{pr2}$

但这会得到实际应该得到的结果:

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

你知道这里发生了什么吗?在


Tags: sample代码testprojectcombyemail部署
3条回答

正如我所看到的,您正在创建一个用户对象并将其持久化到created\u中。 i、 e

users.User(email='test@sample.com')

您正在创建一个用户。用户带有电子邮件的对象'test@sample.com网站'. 您将同样的内容保存到创建的项目中。当您将其与获取当前登录用户的users.get_current_user()进行比较时反对。那这就是为什么它不获取任何对象。而在gql中,您再次使用传递的email创建一个User对象,这显然将与project中持久化的User对象相匹配。在

我想你应该做这样的事

^{pr2}$

筛选器语法不正确。您需要显示运算符(在本例中,“=”)。在

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

发生这种情况是因为您创建的User对象具有匹配的电子邮件地址,但没有匹配的用户ID(因为它没有),因此在查询结果中不会显示为匹配项。你目前的方法有几个问题:

  • 电子邮件地址不能保证保持不变-用户可以更改他们的电子邮件地址
  • 电子邮件地址不能保证是唯一的-有人可能会声称另一个用户已腾空的地址
  • 查询与电子邮件地址以外的属性匹配的用户属性

一般来说,查询用户属性是危险的,并且可能会导致这样的问题。我建议将用户的user_id属性放在一个字符串中,然后对其进行查询。在

相关问题 更多 >