查询过滤器不起作用,但GQL是:app引擎中的错误?

时间:2011-06-15 07:47:40

标签: python google-app-engine

无法在本地devserver(1.5.0)上重现此错误,但是当我们将代码部署到谷歌时,它会开始弹出?这是当前在线版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结果:

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

但这会获取实际应该获取的结果:

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

有什么想法在这里发生?

3 个答案:

答案 0 :(得分:3)

我可以看到你正在创建一个用户对象并将其持久保存到created_by中。 即

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

在这里,您将使用电子邮件“test@sample.com”创建users.User对象。您将持久保存到Projects的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()

答案 1 :(得分:3)

这是因为您创建的User对象具有匹配的电子邮件地址,但没有匹配的用户ID(因为它没有),因此不会在查询结果中显示为匹配。您当前的方法存在一些问题:

  • 不保证电子邮件地址保持不变 - 用户可以更改其电子邮件地址
  • 不保证电子邮件地址是唯一的 - 有人可以声明其他用户腾出的地址
  • 查询用户属性与电子邮件地址以外的属性匹配

通常,查询用户属性很危险,可能会导致此类问题。我建议将用户的user_id属性放在一个字符串中,然后查询该字符串。

答案 2 :(得分:0)

过滤器语法不正确。您需要显示运算符(在本例中为'=')。

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