Django-如何获得前10名最高分数,但将其限制为每位用户一个分数?

桑托

我有一个简单的模型来为任何数量的基于分数的游戏保持分数:

class Score(models.Model):
    game = models.ForeignKey(Game, related_name='leaderboards')
    value = models.IntegerField(db_index=True)
    uom = models.CharField('Unit of Measurement', max_length=10)

    user = models.ForeignKey(settings.AUTH_USER_MODEL)

    class Meta:
        ordering = ['-value']

    ...

我的Django Rest Framework API视图如下,旨在为我提供特定游戏的当前排行榜:

class LeaderboardView(APIView):
    ...

    def get(self, request, pk):
        game = get_object_or_404(Game, pk=pk)

        # Get all scores order by highest to lowest
        scores = (Score.objects.select_related('user').
                  filter(game=game).
                  order_by('-value'))

        # Create and ordered dict to preserve order added
        # and only add user scores who have not been added yet
        top10 = collections.OrderedDict()
        for obj in scores:
            if obj.user.pk not in top10 and len(top10) < 10:
                top10[obj.user.pk] = obj

        # Turn ordered dict back into a QuerySet list
        results = []
        for obj in top10.itervalues():
            results.append(obj)

    serializer = ScoreSerializer(results, many=True)
    return Response(serializer.data)

问题是我在弄清楚如何获取前10个最高分数时遇到了麻烦,但是使用ORM而不是手动获取所有分数然后遍历它们以确保我只获得每个用户的最高分数。

尽管我为获得所需结果而进行的可悲尝试是可行的,但它必须非常低效,并且必须有一种更好的方法可以仅利用ORM的功能来获得这些结果。

感谢您的任何提前帮助。

索拉·库玛(Saurabh Kumar)

与一起使用注释和聚合Max在以下方面:

from django.db.models.aggregates import Max

leaderboard_data = Score.objects.filter(game=game) \
                                .values('user') \
                                .annotate(max_value=Max('value')) \
                                .order_by('-max_value')

这大致转换为GROUP BY带有Max运算符查询

SELECT "user_id", MAX("value") AS "max_value" 
FROM "score"
WHERE "game_id" = 1231
GROUP BY "user_id" 
ORDER BY "max_value" DESC

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

给定一个庞大的学生分数数据集,如何获得 N 个最高分者的姓名?

贪婪算法以获得最高分数

如何将Django REST API限制为仅一个用户?

如何从Redis的SortedSet中获得最高分数(分数和成员)?

获得最高分数和获胜次数

在MySQL中进行比较后如何获得最高分数

接受名称和 10 个分数并返回名称和 6 个最高分数的 Python 程序

如何从此表中的每个不同用户中选择最高分数?

每年寻找最高分数

用最高分数打印学生

在单个查询中显示分数和最高分数

排序值并获取最佳分数(最高分数)

排序值并获取最佳分数(最高分数)

从txt读取分数并显示最高分数和记录

获得最高分的前五名学生

获取每个玩家根据日期获得最高分数的次数

根据最高分数过滤数组中的用户名

为什么不打印单个玩家的最高分数?

获取每次测试最高分的 AVG 分数

在最高分数上添加特定点

熊猫:添加新列,其中包含该人一天达到最高分数的频率

获取最高分数并存储在另一列中

精确查询的QuerySet值必须使用slicing-Django限制为一个结果

Django:精确查找的 QuerySet 值必须使用切片限制为一个结果

如何显示每个部门的最高分数及其名称

如何优化最小和最大以找到最高分数总和

Django:如何从与用户相关的子查询集中获得一个独特的父列表?

在django orm中從特定用戶的最高分中查找總分

使用循环从列表中找到最高分数,最低分数