1

我写了一个这样的 django 查询。

stud_record = Student.objects.filter()

因此 stud_record 是一个查询集。

现在我想做的是,我想计算 stud_record 的总数,然后除以 5。

例如:我有 20 条记录stud_record。除以 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 的学生......像这样

4

4 回答 4

0

尝试使用 Len(stud_record)。这将为您提供该查询集的学生人数。然后使用除法和模数来获得您想要的学生范围。抱歉,我目前使用的笔记本电脑没有安装 Python 程序,我无法为您提供明确的解决方案。希望这可以帮助 :)

于 2013-01-23T07:14:59.697 回答
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

但是,当您将主列表拆分为子列表时,这最后一件事肯定更容易,甚至完全微不足道,而不是之后。

对您创建的每个子列表执行此操作。

也不要将其插入 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”变量。

于 2013-01-23T07:18:43.680 回答
0

我会这样

iter=0
for item in sorted(stud_record, key=lambda x:x['roll']):
    item['rank'] = math.floor(iter / 5) + 1)
    iter+=1

您按“滚动”对项目进行排序,并分配一个“排名”字段,以观察五个箱中的重新分区。

于 2013-01-23T07:58:49.120 回答
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}]]

注意!此解决方案需要对列表进行排序,如果不是,请添加 lst.sort(key=lambda x: x['roll'],reverse=True:)

于 2013-01-23T09:07:22.490 回答