我无法弄清楚如何在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 %}
那我的错误在哪里?
答案 0 :(得分:2)
你提取了最常见的,然后把它们放回到一个新的词典中。 Dicts是无序的。
跳过dict
来电,只需遍历从most_common
获得的结果。
答案 1 :(得分:2)
很高兴得到答案。但是我不想选择Counter,因为我们在Django中有注释。
当您使用Counter时,代码将是
users_cities = Counter(User.objects.all().values_list('city', flat=True)).most_common(5)
导致SQL查询
SELECT city FROM user
您可以改为使用注释。
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
ORDER BY计数DESC LIMIT 5
查询时间也会减少。
我希望这会有所帮助。 :)