2015-04-22 61 views
0

在我的应用程序中,用户获得分数并将其详细信息存储在数据存储区中。当用户登录时,我想显示他们在所有用户中的排名(基本上离他们的最高得分有多远)。所以我的解决方案是按降序对用户的配置文件进行排序,将index + 1添加到Profile模型并在cron中运行。App Engine Python - 对数据库进行排序,然后put()索引

但是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

BTW 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

谢谢,但我使用附带GAE捆绑webapp2的,不Django的。 – 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组。你只需要更多的代码等待提交和处理失败。 –