1

このようなdjangoクエリを作成しました。

stud_record = Student.objects.filter()

したがって、stud_record はクエリセットです。

今私がやりたいことは、stud_record の合計数を計算し、それを 5 で割りたいということです。

例: に 20 のレコードがありstud_recordます。5で割ると、それぞれ4つになりました。だから今、私は最初の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

あなたは自分が何を望んでいるのかという質問で矛盾しています。必要なもののコード例には、それぞれランクを持つ学生のリストが 1 つあります。しかし、サブリスト内のすべての学生に同じランクを割り当てたいとしますそれは2つの異なることです。

リスト内の各レコードに順序番号を付けるには、次のようにします。

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

しかし、この最後のことは、後でではなく、メインリストをサブリストに分割するときに行う方が確実に簡単で、完全に些細なことです.

作成したサブリストごとにそれを行います。

また、それをスタッド レコードに挿入せず、代わりに結果をコンテキストに追加します。クラスベースのビューでは、次のようにできます。

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

最初に辞書にランクを追加してから、次を使用してそれらをグループ化します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 に答える
0

私はこのように行きます

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

アイテムを「ロール」でソートし、5 つのビンで再分割を観察する「ランク」フィールドを割り当てます。

于 2013-01-23T07:58:49.120 に答える