【发布时间】:2018-03-21 01:32:07
【问题描述】:
我有一个简单的模型来保存任意数量的基于分数的游戏的分数:
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 的力量来获得这些结果。
提前感谢您的帮助。
【问题讨论】:
标签: django