【发布时间】:2011-02-10 15:43:23
【问题描述】:
在我的应用中,用户可以关注其他用户,并在他们关注的人执行活动时获取更新。
我以这种方式存储跟随关系:
class User(db.Model):
''' User details '''
username = db.StringProperty()
class Contacts(db.Model):
'''Store users contacts
parent= User (follower)
key_name= Users username (follower)
contacts = A list of keys of Users that a User follows '''
contacts = db.ListProperty(db.Key)
last_updated = db.DateTimeProperty(auto_now=True)
获取关注者和用户关注的用户(关注者和关注者):
'''Get Users that my_user follows'''
my_user = User().all().fetch(1)
contacts = Contacts.get_by_key_name(my_user.username).contacts
''' get my_user followers - copied from an answer here on stackoverflow '''
follower_index = models.Contacts.all(keys_only=True).filter('contacts =',my_user)
follower_keys = [f.parent() for f in follower_index]
followers = db.get(follower_keys)
所以,我想按关注日期订购 my_user 关注者(我在上述模型中不跟踪),但我不确定什么是最好的方法。以下是我能想到的选项:
1) 使用“桥”模型代替 Contacts(db.Model) 的当前结构:
class Contacts(db.Model):
follower = db.ReferenceProperty(User)
following = db.ReferenceProperty(User)
date_created = db.DateTimeProperty(auto_now_add=True)
但是,我仍然需要弄清楚如何确保我有唯一的追随者->关注实体:追随者=用户 1,追随者=用户 2 不应该重复。如果我对我的查询应用 2 个过滤器,我可以做到这一点。
2) 保留当前模型结构,但不是在 Contacts(db.Model) 中包含键列表,而是存储一个元组:[user_key, date_created],如下所示:
class Contacts(db.Model):
'''Store users contacts
parent= User (follower)
key_name= Users username (follower)
contacts = A list of Tuples: User.key(), date_created '''
contacts = db.StringListProperty()
last_updated = db.DateTimeProperty(auto_now=True)
但是,这样我将不得不处理联系人列表: - 我必须从 StringList() 中的每个字符串中提取用户键和 date_created - 然后我可以按创建日期排序用户密钥列表
3)最后一个解决方案(显然效率不高):保留原始数据库结构,并将用户关注活动存储在单独的模型中 - 每个关注操作都与 date_created 字段单独存储。仅使用此表可以按日期对用户关注者列表进行排序。这当然意味着我将执行两个数据存储放置 - 一个到 Contacts(),另一个到 FollowNewsFeed(),如下所示:
Class FollowNewsFeed(db.Model):
''' parent = a User follower'''
following = db.ReferenceProperty(User)
date_created = db.DateTimeProperty(auto_add_now=True)
非常感谢您对解决此问题的最佳方法的任何见解:)
谢谢!
【问题讨论】:
标签: python google-app-engine social-networking