渲染计数器集合排序顺序

时间:2016-09-09 11:50:53

标签: python django collections

我无法弄清楚如何在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 %}

那我的错误在哪里?

2 个答案:

答案 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

查询时间也会减少。

我希望这会有所帮助。 :)