Cette solution a fonctionné pour moi. Vous aurez besoin de le modifier pour le passer à un modèle si.
from django.db.models import Count
all_countries = Country.objects.annotate(Count('story')).order_by('-story__count')
for country in all_countries:
print "Country %s (%s)" % (country.name, country.story__count)
all_cities = City.objects.filter(country = country).annotate(Count('story')).order_by('-story__count')
for city in all_cities:
print "\tCity %s (%s)" % (city.name, city.story__count)
Mise à jour
est une façon d'envoyer ici ces informations au modèle. Celui-ci implique l'utilisation d'un filtre personnalisé.
@register.filter
def get_cities_and_counts(country):
all_cities = City.objects.filter(country = country).annotate(Count('story')).order_by('-story__count')
return all_cities
Vue:
def story_counts(request, *args, **kwargs):
all_countries = Country.objects.annotate(Count('story')).order_by('-story__count')
context = dict(all_countries = all_countries)
return render_to_response(..., context)
Et dans votre modèle:
{% for country in all_countries %}
<h3>{{ country.name }} ({{ country.story__count }})</h3>
{% for city in country|get_cities_and_counts %}
<p>{{ city.name }} ({{ city.story__count }})</p>
{% endfor %}
{% endfor %}
Mise à jour 2
variante avec une méthode personnalisée dans le modèle.
class Country(models.Model):
name = models.CharField(max_length=50)
def _get_cities_and_story_counts(self):
retrun City.objects.filter(country = self).annotate(Count('story')).order_by('-story__count')
city_story_counts = property(_get_cities_and_story_counts)
Cela vous permet d'éviter de définir un filtre. Le code du modèle passe à:
{% for country in all_countries %}
<h3>{{ country.name }} ({{ country.story__count }})</h3>
{% for city in country.city_story_counts %}
<p>{{ city.name }} ({{ city.story__count }})</p>
{% endfor %}
{% endfor %}
Je sais qu'il sommes plusieurs façons de le faire, mais me demandais s'il y a un moyen de tirer parti ORM de Django, comme cette réponse ici, http://stackoverflow.com/questions/ 1010848/traversing-multidimensionnel-dictionnaire-en-django/1011145 # 1011145 – Maverick