App Engine Python - 对数据库进行排序,然后put()索引
在我的应用程序中,用户获得分数并将其详细信息存储在数据存储区中。当用户登录时,我想显示他们在所有用户中的排名(基本上离他们的最高得分有多远)。所以我的解决方案是按降序对用户的配置文件进行排序,将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的
我相信你有过滤器查询错误的语法。从文档,
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')
谢谢,但我使用附带GAE捆绑webapp2的,不Django的。 – Orane
啊,对不起。应该仔细阅读问题。 –
另一个快速评论,也许我正在解释你试图做错什么,但是你不是通过这样做将每个用户的等级重新设置为1吗?你应该从排名作为user.rank开始? –
所以它看起来像数据存储不能批量超过一定的限制。所以我改变了代码如下:
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()
这可行,但你应该批量和异步提高性能。 –
你能用一个例子回答吗? – Orane
看看put_async。您可以传递一个或多个实体。找到一个安全的号码(比如说20),就像以前一样。然后将所有实体分成(20)组和put_async组。你只需要更多的代码等待提交和处理失败。 –
BTW https://docs.python.org/2/library/functions.html#enumerate –