Проблема: мне нужно вывести участников TOP X, определяемых количеством отправленных сообщений.
Данные: у меня есть коллекция сообщений. Это не вопрос базы данных / SQL в приведенном ниже примере запроса, просто дайте обзор кода.
tweetsSQL = db.GqlQuery("SELECT * FROM TweetModel ORDER BY date_created DESC")
Моя модель:
class TweetModel(db.Model):
# Model Definition
# Tweet Message ID is the Key Name
to_user_id = db.IntegerProperty()
to_user = db.StringProperty(multiline=False)
message = db.StringProperty(multiline=False)
date_created = db.DateTimeProperty(auto_now_add=False)
user = db.ReferenceProperty(UserModel, collection_name = 'tweets')
Из примеров на SO я смог найти участников TOP X, выполнив следующие действия:
visits = defaultdict(int)
for t in tweetsSQL:
visits[t.user.from_user] += 1
Теперь я могу отсортировать его, используя:
c = sorted(visits.iteritems(), key=operator.itemgetter(1), reverse=True)
Но теперь единственный способ получить исходные Объекты - это пройти через объект c, найти KeyName и затем найти его в TweetsSQL, чтобы получить Объект TweetModel.
Есть ли лучший способ?
*** Извините, я должен был добавить, что Count (*) недоступен из-за использования Google App Engine
[РЕДАКТИРОВАТЬ 2]
В итоге, учитывая список сообщений, как их упорядочить по количеству сообщений пользователя.
В SQL это будет:
ВЫБРАТЬ * ИЗ TweetModel ГРУППА ПО ПОЛЬЗОВАТЕЛЯМ ПОРЯДОК ПО СЧЕТУ (*)
Но я не могу сделать это в SQL и мне нужно дублировать эту функциональность в коде. Моя отправная точка "SELECT * FROM TweetModel"