2013-04-12 44 views
0

我有一个应用程序托管在应用程序引擎上。它与UserProperty(如下图)沿着某些字段:通过App Engine数据存储中的用户电子邮件过滤记录?

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()) 

哪一个不工作。请帮忙。

+0

当问一个问题你应该descr ibe它是如何不工作的,你会得到一个错误,没有结果,结果,但不是你期望的结果?说完所有这些之后,您使用数据存储区查看器调查了存储在UserProperty中的内容。 –

+0

我没有得到任何错误,但没有结果。并且在数据存储“created_by”列中有用户的电子邮件ID。顺便说一句,我使用'users.get_current_user()',同时填充'created_by'字段。即使在发出p.filter('created_by =''')后,也没有结果(p.count()为0) – rajpy

+0

考虑切换到[NDB](https://developers.google.com/appengine/docs/python/ndb /) – Lipis

回答

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()) 
+0

我刚刚发现,created_by拥有用户实例,因为我在创建帖子时使用了'created_by = users.get_current_user()'。我感到困惑的是Datastore查看器在created_by字段中显示用户的电子邮件ID。我将通过存储额外的字段来使用你的方法。 但我没有得到为什么user_id比电子邮件ID更独特? – rajpy

+0

@rajpy实际上在你的案例中是一样的,因为你不会在你的应用中以任何方式改变它。但通常在应用程序内,实际用户的电子邮件可能会发生变化,因此您绝对不应该依赖电子邮件来获得唯一性。这只是不好的做法.. – Lipis

相关问题