В Django у меня есть приложение с такими моделями:
class Artist(models.Model):
name = models.CharField()
class Song(models.Model):
artist = models.ForeignKey(Artist)
title = models.CharField()
class SongPlay(models.Model):
song = models.ForeignKey(Song)
time = models.DateTimeField()
Я хочу иметь возможность составить таблицу самых популярных песен и самых популярных исполнителей.Как я могу использовать ORM в Django для создания GROUP BY
и COUNT
, как это?
В данный момент я делаю что-то вроде этого:
SongPlay.objects.values('song__id', 'song__artist__name', 'song__title')
.annotate(Count('song')).order_by('-song__count')[:10]
...чтобы получить 10 лучших песен, а это:
SongPlay.objects.values('song__artist__id', 'song__artist__name')
.annotate(Count('song__artist')).order_by('-song__artist__count')[:10]
... чтобы получить 10 лучших исполнителей.
Есть ли более простой способ добиться этого?Мне не очень нравится указывать values
, я бы предпочел получить кортежи по линиям (song_object, count)
и (artist_object, count)
.
Есть ли что-то очевидное, что я пропустил?Спасибо!