2015-10-13 4 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] 

, но он не работает с manytomany полями. Любая помощь приветствуется.

+1

ваше родственное имя должно быть «песнями», а не «жанрами», поскольку оно относится к жанру и песне. –

ответ

2

Предполагая, что related_name на модели песни является «песнями», потому что это должно быть.

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

Это даст вам идентификатор всех 10 лучших родов и песен в них.

+0

Это именно то, что я хотел. Большое спасибо :) – evilmind