我写过像这样的django查询。
stud_record = Student.objects.filter()
因此,stud_record是一个查询集。
现在我想做的是,我想计算stud_record的总数,然后将其除以5.
例如:我在stud_record
中有20条记录。除以5后,我得到4。所以现在我想把前四名学生排在第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名学生......就像这样
答案 0 :(得分:0)
尝试使用Len(stud_record)。这将为您提供该查询集的学生人数。然后玩分裂和模数来获得你想要的学生范围。对不起,我无法给你一个明确的解决方案,我正在使用的笔记本电脑没有安装Python程序。希望这会有所帮助:)
答案 1 :(得分:0)
你在自己想要的问题上与自己相矛盾。您想要的示例代码有一个学生列表,每个都有一个等级。但是你说你想为子列表中的所有学生分配相同的等级。这是两件不同的事情。
为列表中的每条记录提供订单号,请执行以下操作:
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'变量。
答案 2 :(得分:0)
我会这样做
iter=0
for item in sorted(stud_record, key=lambda x:x['roll']):
item['rank'] = math.floor(iter / 5) + 1)
iter+=1
您可以通过'roll'对项目进行排序,并指定一个在五个分区中观察重新分区的“排名”字段。
答案 3 :(得分:0)
首先在您的dicts中添加排名,然后使用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}]]
NB!此解决方案需要对列表进行排序,如果不是,则添加:
lst.sort(key=lambda x: x['roll'],reverse=True
)