我已经写了一个这样的django查询。
stud_record = Student.objects.filter()因此,stud_record是一个查询集。
现在我想做的是,我想计算stud_record的总数,然后除以5。
例如:我在stud_record中有20条记录。除以5后,我得到4。因此,现在我想将前四名学生排名为ran 1,然后将5-8名学生排名为2…16-20名学生排名为5。此排名将被插入到相同的stud_record中,并将发送到模板页面。
我们怎么才能做到。
目前我得到的结构是这样的
[{'name': u'mark', 'roll': 71},
{'name': u'robin', 'roll': 42},
{'name': u'julien', 'roll': 39}]在除法和插入秩之后,它应该看起来像
[[{'name': u'mark', 'roll': 71, 'rank': 1},
{'name': u'robin', 'roll': 42, 'rank': 1},]
[{'name': u'julien', 'roll': 39, 'rank': 2}]]现在我在我的stud_record中得到了185个结果。除以185/5后,我得到37。现在我想给出排名1到1-37的学生,然后排名2到38-75的学生…像这样
发布于 2013-01-23 17:07:22
首先将排名添加到字典中,然后使用itertools.groupby对它们进行分组
from itertools import groupby
lst = [{} for _ in range(21)] # simple testlist
def rank_it(lst,n):
for index,d in enumerate(lst):
rank = index/(len(lst)/n)+1
d['rank'] = rank if rank < n else n
rank_it(lst,5) # add ranks
[list(g) for _,g in groupby(lst, lambda x: x['rank'])] #group by rank输出:
[[{'rank': 1}, {'rank': 1}, {'rank': 1}, {'rank': 1}],
[{'rank': 2}, {'rank': 2}, {'rank': 2}, {'rank': 2}],
[{'rank': 3}, {'rank': 3}, {'rank': 3}, {'rank': 3}],
[{'rank': 4}, {'rank': 4}, {'rank': 4}, {'rank': 4}],
[{'rank': 5}, {'rank': 5}, {'rank': 5}, {'rank': 5}, {'rank': 5}]]注意!此解决方案需要对列表进行排序,如果没有,请添加:lst.sort(key=lambda x: x['roll'],reverse=True__)
发布于 2013-01-23 15:15:00
尝试使用Len(stud_record)。这将为您提供该查询集的学生数量。然后使用除法和模数来得到你想要的学生范围。很抱歉,我不能给你一个明确的解决方案,因为我目前使用的笔记本电脑没有安装Python程序。希望这能有所帮助:)
发布于 2013-01-23 15:18:44
你在关于你想要什么的问题上自相矛盾。您想要的示例代码有一个学生列表,每个学生都有一个排名。但是您说您想要将相同的排名分配给子列表中的所有学生。这是两件不同的事情。
要为列表中的每条记录提供订单号,请执行以下操作:
for rank, student in enumerate(student_list):
student['rank'] = rank为了向子列表中的所有记录提供相同的排名,您可以这样做:
for rank, student_list in enumerate(all_students):
for student in student_list:
student['rank'] = rank但是,当您将主列表拆分成sub_lists时,这最后一件事肯定会更容易,甚至完全是微不足道的,而不是之后。
对您创建的每个子列表执行此操作。
此外,不要将其插入到stud_record中,而是将结果添加到上下文中。在基于类的视图中,您可以这样做:
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(KlassDetailView, self).get_context_data(**kwargs)
# Add data to the context:
stud_record = Student.objects.filter()
context['stud_ranks'] = calculate_ranks(stud_record)
return context现在,您可以在模板中使用'stud_ranks‘变量。
https://stackoverflow.com/questions/14474186
复制相似问题