В моем приложении пользователи могут следить за другими пользователями и получать обновления, когда люди, за которыми они следят, выполняют действия.
Я сохраняю следующие отношения следующим образом:
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) Вместо текущей структуры для контактов (db.Model), используйте модель "моста":
class Contacts(db.Model):
follower = db.ReferenceProperty(User)
following = db.ReferenceProperty(User)
date_created = db.DateTimeProperty(auto_now_add=True)
Однако я все ещеЯ должен выяснить, как убедиться, что у меня есть уникальные подписчики-> следующие объекты: follower = user1, follow = user2 не должен повторяться.Я могу сделать это, если я применю к моему запросу 2 фильтра.
2) Сохраните текущую структуру модели, но вместо списка ключей в Контактах (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)
Однако таким образом мне придется обрабатывать список контактов: - Я должен извлечь ключи пользователя и date_created из каждой строки в StringList () -Затем я могу упорядочить список пользовательских ключей по дате создания
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)
Любые идеи о том, как лучше всего с этим справиться, высоко ценятся)
Спасибо!