CocoaChina 11-08
python – 用于查找用户最喜欢的故事的良好.
index_new4.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

原创设计

以下是我最初设置模型的方法:

class UserData ( db.Model ) : user = db.UserProperty ( ) favorites = db.ListProperty ( db.Key ) # list of story keys # ...class Story ( db.Model ) : title = db.StringProperty ( ) # ...

在显示故事的每个页面上 , 我将查询当前用户的 UserData:

user_data = UserData.all ( ) .filter ( 'user =' users.get_current_user ( ) ) .get ( ) story_is_favorited = ( story in user_data.favorites )

新设计

在看了这个演讲之后:Google I/O 2009 – Scalable, Complex Apps on App Engine, 我想知道我是否可以更有效地进行设置 .

class FavoriteIndex ( db.Model ) : favorited_by = db.StringListProperty ( )

故事模型是相同的 , 但我摆脱了 UserData 模型 . 新的 FavoriteIndex 模型的每个实例都有一个 Story 实例作为父实例 . 每个 FavoriteIndex 都会在其 favited_by 属性中存储一个用户 ID 列表 .

如果我想找到某个用户喜欢的所有故事:

index_keys = FavoriteIndex.all ( keys_only=True ) .filter ( 'favorited_by =', users.get_current_user ( ) .user_id ( ) ) story_keys = [ k.parent ( ) for k in index_keys ] stories = db.get ( story_keys )

这种方法避免了与 ListProperty 相关联的序列化 / 反序列化 .

效率与简单性

我不确定新设计的效率如何 , 特别是在用户决定收藏 300 个故事之后 , 但这就是我喜欢它的原因:

> 受欢迎的故事与用户相关联 , 而与用户数据无关

> 在我显示故事的页面上 , 很容易询问故事是否被收藏 ( 没有调用填充用户数据的单独实体 ) .

fav_index = FavoriteIndex.all ( ) .ancestor ( story ) .get ( ) fav_of_current_user = users.get_current_user ( ) .user_id ( ) in fav_index.favorited_by

> 也可以轻松获得所有喜欢故事的用户列表 ( 使用 #2 中的方法 )

有没有更简单的方法?

请帮忙 . 通常这种事情怎么样?

最佳答案

你所描述的是一个很好的解决方案 . 但是 , 您可以进一步优化它:对于每个收藏夹 , 创建一个 "UserFavorite" 实体作为相关 Story 条目的子实体 ( 或者等效地 , 作为 UserInfo 条目的子实体 ) , 将键名设置为用户的唯一 ID. 通过这种方式 , 您可以确定用户是否通过简单的 get 获得了故事:

UserFavorite.get_by_name ( user_id, parent=a_story )

获取操作比查询快 3 到 5 倍 , 因此这是一项重大改进 .

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论