django模板中查询集的简单排名

时间:2011-01-28 16:48:51

标签: django rank django-queryset

我在一个简单的django应用程序中有一个模型,记录了参加比赛的人的分数。我有两个模型对象,Entry和Person。每个条目都有一个人,一个人有多个条目。

我想生成一个页面,显示每个用户,他们的总分和他们的排名。

我到目前为止的命令如下:

Entry.objects.values('person__name').annotate(total=Sum('score')).order_by('-total')

我可以使用for块很好地将结果输出到页面上。我唯一没有得到的就是排名。

为每条记录添加记录的数字排名的最佳方法是什么,包括当两个分数相同时,排名反映这一点(即“4 =”)?尝试使用forblock.counter和一些先行/后置机制在模板中执行此操作会更好,还是尝试将此字段用于查询本身?

3 个答案:

答案 0 :(得分:7)

这种事情非常棘手。我实际上会在视图中完成所有工作,在那里修改查询集并将其传递给模板。

rank = 1
previous = None
entries = list(entries)
previous = entries[0]
previous.rank = 1
for i, entry in enumerate(entries[1:]):
    if entry.value != previous.value:
        rank = i + 2
        entry.rank = str(rank)
    else:
        entry.rank = "%s=" % rank
        previous.rank = entry.rank
    previous = entry

答案 1 :(得分:1)

保持简单,使用模板loop.counter或loop.revcounter,在这种情况下不要乱用查询。

答案 2 :(得分:-1)

除了person.name,你没有得到任何东西,因为你在值中指定了它。添加total即可。

Entry.objects.values('person__name', 'total').annotate(total=Sum('score')).order_by('-total')

编辑:

另一种解决方案:

Person.objects.values('name').annotate(total=Sum('entries__score')).order_by('-total')