Google App Engine: сортировка коллекций в отношениях «многие ко многим» - PullRequest
0 голосов
/ 09 июля 2011

рассмотрим следующую модель:

class Tweet(db.Model):
    text = db.StringProperty
    created_at = db.DateTimeProperty()

class Company(db.Model):
    short_name = db.StringProperty()
    full_name = db.StringProperty()
    oneword_name = db.StringProperty()

class TweetMentionsCompany(db.Model):
    tweet = db.ReferenceProperty(Tweet, required=True,
                        collection_name='mentions_companies')
    company = db.ReferenceProperty(Company, required=True, 
                        collection_name='tweets_mentioned_in')

Если у меня есть значение для Company.oneword_name, как я могу получить список 100 последних твитов, в которых упоминается связанная компания, в хронологическом порядке?

Мой текущий код выглядит примерно так, но я не уверен, как изменить его в хронологическом порядке:

company = models.Company().all().filter('oneword_name = ', oneword_name.lower()).get()

for e,tmc in enumerate(company.tweets_mentioned_in):
    if e>100: break
    print_tweet_lite(self, tmc.tweet)

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Такой тип запроса на основе объединения невозможен в хранилище данных.На вашем месте я бы создал [ListProperty][1] на Tweet, который содержит список упомянутых компаний - этот список может быть легко вычислен в то же время, когда вы планировали вычислять сущности TweetMentionsCompany.

Затем вы можете сделать filter('company = ', company) на Tweet, чтобы найти список твитов, в которых упоминается компания (это будет совпадать, если какая-либо компания в списке соответствует данной компании), и отсортировать его любым удобным для вас способом.

1 голос
/ 09 июля 2011

Вы должны добавить поле created_at = db.DateTimeProperty() в ваше TweetMentionsCompany и отсортировать по нему.

Это NoSQL, " нормализация базы данных " здесь не очень хорошо работает

...