【问题标题】:Filtering records by user email in App Engine Datastore?在 App Engine Datastore 中按用户电子邮件过滤记录?
【发布时间】:2013-04-12 06:55:53
【问题描述】:

我在应用引擎上托管了一个应用。它有一些字段以及 UserProperty() 如下所示:

class Post(db.Model):
    title = db.StringProperty(required=True)
    created_by = db.UserProperty(required=True)
    ...#some other fields

我正在尝试按 created_by 字段过滤记录,以便应用程序显示由登录用户创建的记录。我试过了:

p = Post.all()
p.filter('created_by =', users.get_current_user())

这不起作用。请帮忙。

【问题讨论】:

  • 在询问有关问题的问题时,您应该描述它是如何不工作的,您是否收到错误、没有结果、结果但不是您期望的结果?说了这么多,您是否已经使用数据存储查看器调查了 UserProperty 中存储的内容。
  • 我没有收到任何错误,但没有结果。并且在数据存储“created_by”列中有用户的电子邮件 ID。顺便说一句,我在填写“created_by”字段时使用了“users.get_current_user()”。即使发出 - p.filter('created_by =' '') 也没有结果(p.count() 为 0)
  • 考虑切换到NDB

标签: google-app-engine


【解决方案1】:

如果您的登录用户没有单独的模型,您应该在帖子中也存储user_id 而不是email,因为前者更独特。

只需在Post 中再添加一个字段

class Post(db.Model):
  title = db.StringProperty(required=True)
  created_by = db.UserProperty(required=True)
  user_id = db.StringProperty(required=True)
  ...

然后在 Post 创建时做这样的事情:

post_db = Post(title='Hello world', 
               created_by=users.get_current_user(), 
               user_id=users.get_current_user().user_id())

现在,如果您想显示登录用户发布的所有帖子,您应该:

p = Post.all()
p.filter('user_id =', users.get_current_user().user_id())

【讨论】:

  • 我刚刚发现,created_by 保存了用户实例,因为我在创建帖子时使用了 'created_by = users.get_current_user()'。让我感到困惑的是数据存储查看器在 created_by 字段中显示用户的电子邮件 ID。我将通过存储额外的字段来使用您的方法。但我不明白为什么 user_id 比 email id 更独特?
  • @rajpy 实际上在您的情况下是相同的,因为您没有在您的应用程序中以任何方式更改它。但一般来说,在应用程序中,实际用户的电子邮件可能会发生变化,因此您永远不应该依赖电子邮件来获得唯一性。这只是不好的做法..
猜你喜欢
  • 2018-06-05
  • 2016-06-21
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多