Следуйте структуре модели хранилища данных в AppEngine - упорядочивайте подписчиков по дате

В моем приложении пользователи могут подписываться на других пользователей, и получать обновления всякий раз, когда люди, за которыми они следят, выполняют действия.

Я сохраняю следующие отношения следующим образом:

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, following = user2 не должен повторяться. Я могу это сделать, если, думаю, применю к моему запросу 2 фильтра.

2) Сохраните текущую структуру модели, но вместо списка ключей в Контактах (db.Model) сохраните кортеж: [user_key, - Мне нужно извлечь ключи пользователя и 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)

Любые идеи о том, как лучше всего справиться с этим, приветствуются:)

Спасибо !

5
задан yasser 10 February 2011 в 15:49
поделиться