2015-10-13 99 views
2

我有一個簡單的任務。有兩種模式在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) 
    ... 

我需要獲得最受歡迎的標籤列表與歌曲的數量。例如:

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

對於外鍵,我可以使用

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

,但它不具有多對多下地幹活。任何幫助將非常感激。

+1

您的相關名稱應該是'歌曲'而不是'流派',因爲它可以從流派查詢到歌曲。 –

回答

2

假設歌曲模型的related_name是'歌曲',因爲它應該是。

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

這會給你所有前10位generes和songs_count的ID在他們。

+0

這正是我想要的。非常感謝 :) – evilmind