2011-01-28 16 views
3

私は、競争に参加する人々のスコアを記録する単純なdjangoアプリケーションでモデルを得ま​​した。私は2つのモデルオブジェクトEntryとPersonを持っています。各エントリーにはPersonがあり、Personには複数のエントリーがあります。djangoテンプレートのquerysetの単純な順位

各ユーザー、合計得点、順位を示すページを生成したいと考えています。ブロックのために使用して

Entry.objects.values('person__name').annotate(total=Sum('score')).order_by('-total') 

私ができるページへの出力この結果をうまく:

次のように私がこれまで持っているコマンドがあります。私が得意でないのはランクだけです。

2つのスコアが同じ場合、ランクはこれを反映する(つまり、「4 =」)ことを含めて、レコードの数値ランクを各レコードに追加する最良の方法は何ですか? forblock.counterと先読み/後ろ向きのメカニズムを使用してテンプレート内でこれを試したり、これをやってみたり、このフィールドをクエリ自体に使ってみたりする方が良いでしょうか?

答えて

6

この種のものは非常にトリッキーです。私は実際にビュー内のすべての作業を行い、クエリーセットを変更してテンプレートに渡します。

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 
+0

私はこれを行くつもりです、建築的に最高のアイデアに見えます。 – growse

+0

entry.valueをentry ['value']に、previous.rankを以前の['rank'](と同様のもの)に変更する必要はありませんが、これは完全に機能しました。ありがとう! – growse

-1

値で指定したため、person.name以外は何も得られません。 totalを追加してください。

Entry.objects.values('person__name', 'total').annotate(total=Sum('score')).order_by('-total') 

EDIT:

別の解決策:

Person.objects.values('name').annotate(total=Sum('entries__score')).order_by('-total') 
+1

Er、no。 'total'は注釈呼び出しから来ます。 –

+0

すぐに私の間違いを指摘してくれてありがとう:) 2番目の解決方法はどうですか? – Ski

+0

第2の解決策は、依然として人々をスコアでランク付けするのに役立たない。 –

1

テンプレートloop.counterまたはloop.revcounterを使用して、このケースではクエリを混乱させないようにしてください。

関連する問題