Możesz także użyć regroup
znacznika szablonu do grupowania według atrybutów. Z dokumentów:
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
...
{% regroup cities by country as country_list %}
<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Wygląda tak:
- Indie
- Bombaj: 19 000 000
- Kalkuta: 15 000 000
- USA
- Nowy Jork: 20 000 000
- Chicago: 7 000 000
- Japonia
Działa również na QuerySet
s wierzę.
źródło: https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#regroup
edytuj: zwróć uwagę, że regroup
tag nie działa tak, jak byś tego oczekiwał, jeśli lista słowników nie jest posortowana według klucza. Działa iteracyjnie. Więc posortuj listę (lub zestaw zapytań) według klucza grupującego przed przekazaniem go do regroup
znacznika.
Members.objects.filter(date=some_date).values('designation').annotate(dcount=Count('designation'))