2015-10-13 100 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