2009-11-20 11 views
3

J'ai un modèle simple avec des nouvelles et des catégories:Comment compter et afficher des objets en relation avec ManyToMany dans Django

class Category(models.Model): 
    name = models.CharField() 
    slug = models.SlugField() 

class News(models.Model): 
    category = models.ManyToManyField(Category) 
    title = models.CharField() 
    slug = models.SlugField() 
    text = models.TextField() 
    date = models.DateTimeField() 

Je veux compter nouvelles pour chaque catégorie et l'afficher sur le site, comme celui-ci:

Sport (5) 
School (4) 
Films (6) 
Computer (2) 
etc... 

Comment est-ce que je peux faire ceci?

Merci!

Répondre

7

Découvrez la fonction annotate() de Django 1.1.

http://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation

Exemple (à partir de cette URL ci-dessus):

>>> q = Book.objects.annotate(num_authors=Count('authors')) 
>>> q[0].num_authors 
2 
>>> q[1].num_authors 
1 
+0

J'ai essayé, mais je m'y suis AttributeError: objet 'Manager' n'a pas d'attribut ' annoter ' – Matthew

+1

Ok cela fonctionne, mais je veux compter les nouvelles dans la catégorie, pas les catégories dans les nouvelles ... – Matthew

+0

Category.objects.all(). annotate (num_news = Count (' news_set ')) –

1

Très simple:

>>> for category in Category.objects.all(): 
...  print category.name, category.news_set.count() 
+0

C'est exagéré. –

Questions connexes