2015-10-13 6 views
2

J'ai une tâche simple. Il y a deux modèlesGrouper par manytomany fields à Django

class Song(models.Model): 
    song_title = models.CharField(max_length=200) 
    song_genres = models.ManyToManyField(Genres, null=True, related_name='genres') 
    ... 

class Genre(models.Model): 
    genre_title = models.CharField(max_length=50) 
    genre_uri = models.SlugField(max_length=100, unique=True, blank=True) 
    ... 

J'ai besoin d'obtenir la liste des balises les plus populaires avec le nombre de chansons. Par exemple:

[{<Genres: Pop>, 20}, {<Genres: Rap>, 15} ...] 

Pour clé étrangère je peux utiliser

Song.objects.annotate(count=Count('song_genres')).order_by('-count')[:5] 

mais il ne fonctionne pas avec les champs de ManyToMany. Toute aide serait très appréciée.

+1

votre nom associé devrait être «chansons» et non «genres» comme pour interroger de genre en chanson. –

Répondre

2

En supposant que related_name sur le modèle de chanson est «chansons», car il devrait être.

Genres.objects.annotate(songs_count=Count('songs')).order_by('-songs_count')[:10].values('id', 'songs_count') 

Cela vous donnera id de tous les 10 premiers générateurs et songs_count en eux.

+0

C'est exactement ce que je voulais. Merci beaucoup :) – evilmind