2010-07-25 51 views
1

我是Google Apps的新手,并且一直在讨论在Google应用网站上列出的Hello World应用。一旦我完成了应用程序,我决定尝试扩展它。我添加的第一件事是允许提交它们的用户过滤留言者帖子的功能。无法访问代码中的UserProperty成员

所有我已经改变/添加只是一个WSGIApplication的处理程序和这个处理程序的一个新类。该模型是一样的,我会后供参考:

class Greeting(db.Model): 
    author = db.UserProperty() 
    content = db.StringProperty(multiline = True) 
    date = db.DateTimeProperty(auto_now_add=True) 

使用Django模板我改变,从显示作者昵称行:

<b>{{ greeting.author.nickname }}</b> wrote: 

到:

<a href="/authorposts/{{ greeting.author.user_id }}"> 
    {{ greeting.author.nickname }} 
</a></b> wrote: 

我遇到的问题是,在我的Python代码中,我无法访问“greeting.author.nickname”或任何其他属性,如“user_id”。但是,它们可以从Django模板访问,因为我上面为模板列出的代码可以正常工作,并且可以正确创建指向作者的链接以及显示昵称。

我使用基于作者(UserProperty)属性“user_id”的URL映射。我试图找到一种方法,可以使用user_id作为条件过滤数据存储区。我试着直接对查询应用一个过滤器,我尝试过把所有记录都拉出来,然后遍历它们并使用If ... Else子句。

我知道值存储在数据存储中,因为Django模板显示它,我必须做些什么来将其用作过滤条件?

+1

你的看法是什么样子? – xj9 2010-07-25 04:07:40

+0

对不起,我以为你在使用Django。尝试创建一个问候类的实例。 – xj9 2010-07-25 04:09:30

回答

1

当查询Greeting模型,不能对字段内过滤Greeting.author(例如,greeting.author.nickname)。在SQL中,这可以通过在GreetingUser表上进行联接来完成。但是,在GAE中,您只能查询直接包含在正在查询的模型中的属性。

由于authordb.UserProperty,你可以过滤器用户是这样的:

# fetch up to 10 greetings by the current user 
user = users.get_current_user() 
results = Greeting.all().filter('author =', user).fetch(10) 

要在其他领域过滤器内author,你将需要进行非规范化的Greeting模型 - 即加复制的字段author,您希望能够过滤Greeting。如果这种非规范化的添加到模型

class Greeting(db.Model): 
    author = db.UserProperty() 
    author_nickname = db.StringProperty() # denormalization (copy of author.nickname) 
    content = db.StringProperty(multiline = True) 
    date = db.DateTimeProperty(auto_now_add=True) 

:例如,如果你想通过author.nickname过滤,你会一个author_nickname字段添加到您的Greeting模型(并保持其价值高达日期author.nickname)使用尼克约翰逊的aetycoon library可以更新author_nickname,只要author被更新(这样你就不必手动执行该关系)。

+0

我的第一个示例中存在的问题是我试图使用user_id进行筛选,但是我没有以该用户身份登录。有没有一种方法可以创建一个用户对象与我试图过滤的ID? 关于你的第二个例子,我考虑过那条路线,如果这是唯一的方法,那么我会实现,我会检查出这个库,因为某些事情告诉我如果人们有创建的库具有保持非规格化数据一致的功能,它可能是目前唯一的方法。 – Timbermar 2010-07-25 15:10:40

+0

这听起来像去规范化将需要获得你想要的功能。您还可以将'user_id'添加到'Greeting'模型。 – 2010-07-25 17:26:16

+0

是的,我认为这将是我使用的方法,我没有发现任何其他可以提供此功能的方法。谢谢! – Timbermar 2010-07-25 17:59:13