【发布时间】:2009-10-13 18:36:46
【问题描述】:
原创设计
这是我最初设置 Models 的方式:
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()
Story Model 是一样的,但我去掉了UserData Model。新FavoriteIndex Model 的每个实例都有一个Story 实例作为父实例。每个FavoriteIndex 都在其favorited_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 个故事之后,但这就是我喜欢它的原因:
收藏的故事与用户相关联,而不是与她的
user data-
在我显示
story的页面上,很容易询问story是否已被收藏(无需调用填充用户数据的单独实体)。fav_index = FavoriteIndex.all().ancestor(story).get() fav_of_current_user = users.get_current_user().user_id() in fav_index.favorited_by 也很容易获得所有收藏过故事的用户的列表(使用#2中的方法)
有没有更简单的方法?
请帮忙。这种事情一般是怎么做的?
【问题讨论】:
-
也许这里有一些我不明白的地方,但根据查询文档 (code.google.com/appengine/docs/python/datastore/…),列表的使用非常有限。因此,如果您想查找某个用户的收藏夹,那么您编写的按“favorited_by”过滤的查询几乎仅限于 30 个用户......我在这里遗漏了什么吗?
标签: python google-app-engine google-cloud-datastore