我在一个简单的django应用程序中有一个模型,记录了参加比赛的人的分数。我有两个模型对象,Entry和Person。每个条目都有一个人,一个人有多个条目。
我想生成一个页面,显示每个用户,他们的总分和他们的排名。
我到目前为止的命令如下:
Entry.objects.values('person__name').annotate(total=Sum('score')).order_by('-total')
我可以使用for块很好地将结果输出到页面上。我唯一没有得到的就是排名。
为每条记录添加记录的数字排名的最佳方法是什么,包括当两个分数相同时,排名反映这一点(即“4 =”)?尝试使用forblock.counter和一些先行/后置机制在模板中执行此操作会更好,还是尝试将此字段用于查询本身?
答案 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')