2016-09-09 38 views
1

コレクションを表示する方法がわかりません。Djangoで正しい順序で表示:Counter()。most_common(5)を使用すると、5つの最も一般的なキーが順番に表示されます。しかし、それはしません。私はこれ持ってレンダリングカウンタのコレクション並べ替え順序

users_cities = dict(Counter(User.objects.all().values_list('city', flat=True)).most_common(5)) 
return render(request,'admin/stats/stats.html', { 'users_cities': users_cities, } 

しかし際のテンプレートでそれらを通して私がループを、それらがソートアレント:

{% for label , counter in users_cities.items %} 
    {% if label %} 
    <tr> 
    <th>{{ label }}</th><td> {{ counter }}</td> 
    </tr> 
    {% endif %} 
{% endfor %} 

だから私の間違いはありますか?

+1

dictへの変換私が思うような問題があります。 dict(Counter(User.objects.all()。values_list( 'city'、flat = True))。most_common(5))は命令されたdictを与えません。あなたはシェルで試着することができます –

+0

まさにダニエルが言及したように –

答えて

2

あなたは答えが得意です。しかし、私はDjangoで注釈を付けているので、Counterの方が好きではありません。あなたはカウンターを使用する場合

コードは、あなたが代わりに注釈を使用することができます

SELECT city FROM user 

のSQLクエリになり

users_cities = Counter(User.objects.all().values_list('city', flat=True)).most_common(5) 

になります。

users_cities = User.objects.all().values('city').annotate(count = Count('city')).order_by('-count')[:5] 

これは

SELECT city, COUNT(user.city) AS count FROM user GROUP BY user.city 

のクエリで結果カウントDESCをLIMIT BY ORDER 5

とクエリ時間も少なくなります。

これが役立つことを願っています。 :)

+0

より効率的な方法です!ありがとう! – Schachjunge

2

最も一般的なものを抽出しましたが、新しい辞書に戻しました。辞書は順序付けられていません。

dictコールをスキップし、結果をmost_commonから繰り返してください。

+0

どうしてですか? 'most_common()'はタプルのリストを返します。ちょうど同じ方法で繰り返します。 –

+0

はい、あなたは正しいです!私はdict()を取り除きましたので、.itemsとその作業も取り除かなければなりませんでした! Wohoooありがとう! – Schachjunge

関連する問題