在Appengine上收藏系统

时间:2010-06-07 17:17:08

标签: google-app-engine

我有以下模型结构

class User(db.Model) :
nickname = db.StringProperty(required=True)
fullname = db.StringProperty(required=True)

class Article(db.Model) :
title = db.StringProperty(required=True)
body = db.StringProperty(required=True)
author = db.ReferenceProperty(User, required=True)

class Favorite(db.Model) :
who = db.ReferenceProperty(User, required=True)
what = db.ReferenceProperty(Article, required=True)


我想根据这种模式显示10篇文章:

article.title,article.body,article.author(昵称),如果这篇文章已被登录用户收藏的信息。

我添加了一个函数,我只使用一个查询(it is described here)来获取这些文章的作者

但是我不知道如何处理收藏夹(我想知道哪些显示的文章已被我收藏少于10个查询(我想显示10篇文章))。有可能吗?

3 个答案:

答案 0 :(得分:2)

如果您更多地对数据进行非规范化,您实际上可以使用 0个查询摊销成本执行此操作!将favorites属性添加到Authors,其中存储用户已收藏的文章的键列表。然后,您只需选中此列表即可确定该文章是否是用户的最爱。

如果您在用户首次登录时检索此收藏夹列表并将其存储在用户的会话数据中(并在用户添加/删除收藏夹时更新它),则您不必查询数据存储区检查项目是否是最喜欢的。


建议更新Authors模型:

class Authors(db.Model):  # I think this would be better named "User"
    # same properties you already had ...
    favorites = db.ListProperty(db.Key, required=True, default=[])

当用户登录时,只需在会话数据中缓存他们的收藏列表:

session['favs'] = user.favorites

然后,当您显示最新文章时,您可以通过查看每篇文章的密钥是否已经缓存的收藏夹列表来检查它们是否是收藏夹(或者您可以动态查询收藏夹列表但是实际上没有必要)。

favs = session['favs']
articles = get_ten_latest_articles()
for article in articles:
    if article.key() in favs:
        # ...

答案 1 :(得分:1)

我认为还有一个解决方案。

让我们在User和Article类中添加“自动增量”字段。

然后,当我们想要向Favorite类添加一个条目时,我们还将以我们能够知道的格式添加密钥名称,该格式具有登录用户和文章的自动增量值,例如'UserId'+ id_of_the_user + '条款ArticleID' + id_of_an_article。

然后,当涉及到显示时,我们将轻松预测收藏夹的关键名称,并且能够使用Favorite.get_by_key_name(key_names)。

答案 2 :(得分:0)

dound的另一种解决方案是将收藏文章的发布日期存储在Favorite条目中。然后,在查询时只需按顺序排序。