4

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

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

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

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

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

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

4

3 回答 3

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
于 2011-01-28T17:25:16.387 回答
1

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

于 2011-01-28T23:12:16.513 回答
-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')
于 2011-01-28T16:57:45.943 回答