分组在Django的许多领域

时间:2015-10-13 10:06:01

标签: django grouping manytomanyfield annotate

我有一个简单的任务。有两种模式

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 个答案:

答案 0 :(得分:2)

假设歌曲模型上的related_name是&#39;歌曲&#39;,因为它应该是。

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

这将为您提供所有前10个基因和其中的songs_count的ID。