2015-04-22 2 views
0

В моем приложении пользователи зарабатывают счет, а их данные сохраняются в хранилище данных. Когда пользователь входит в систему, я хочу показать свой рейтинг среди всех пользователей (в основном, как далеко от верхнего балла). Поэтому моим решением было отсортировать профили пользователей в порядке убывания, поместив индекс + 1 в модель профиля и запустив его в cron.App Engine Python - Сортировка db then put() index

Однако cron терпит неудачу. Любая помощь или консультация по лучшему способу была бы оценен:

from google.appengine.ext import db 

    def universal_rank(self): 
     users = Profile.all().filter('leaderboard =', l.key()).order('-score') 
     rank = 0 
     for user in users: 
      rank = rank + 1 
      user.rank = rank 

     db.put(users) 

Я использую webapp2

+0

кстати https://docs.python.org/2/library/functions.html#enumerate –

ответ

0

Я считаю, что у вас есть неправильный синтаксис для запроса фильтра. Из документов,

https://docs.djangoproject.com/en/1.8/topics/db/queries/

Похоже, что вам нужно что-то вроде этого ..

users = Profile.objects.all().filter('leaderboard =', l.key()).order('-score')

Или, на самом деле, я не думаю, что вам нужно в .all() в целом ,

users = Profile.objects.filter('leaderboard =', l.key()).order('-score')

Я также не уверен, где вы получаете l.key(), но если вы получаете все пользователи, я думаю, что вы могли бы просто сделать

users = Profile.objects.all().order('-score')

+0

Спасибо, но я использую webapp2, которые приходят в комплекте с GAE, не Джанго. – Orane

+0

ах, извините за это. Должен был прочитать вопрос ближе. –

+0

еще один быстрый комментарий, и, может быть, я интерпретирую то, что вы пытаетесь сделать неправильно, но разве вы не перебиваете ранг до 1 для каждого пользователя, делая это? Если вы начинаете с ранга как user.rank? –

0

Так что похоже хранилище данных не может накладываться на определенный предел. поэтому я изменил код следующим образом:

from google.appengine.ext import db 

def universal_rank(self): 
    users = Profile.all().filter('leaderboard =', l.key()).order('-score') 
    rank = 0 
    for user in users: 
     rank = rank + 1 
     user.rank = rank 
     user.put() 
+0

Это работает, но вы должны поместить партии и асинхронно для повышения производительности. –

+0

Не могли бы вы ответить на пример? – Orane

+0

Посмотрите на put_async. Вы можете передать одно или несколько объектов. Найдите безопасный номер (скажем, 20), чтобы сразу положить, как раньше. Затем разбивайте все объекты в группах по (20) и put_async каждый. Вам нужно еще немного кода, чтобы дождаться, пока не произойдет фиксация и не сработает. –