Группировка по ForeignKey и ForeignKeys, которые являются еще одним «шагом» - PullRequest
0 голосов
/ 03 марта 2012

В 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).

Есть ли что-то очевидное, что я пропустил?Спасибо!

1 Ответ

1 голос
/ 03 марта 2012

Вы должны начать строить свои запросы из объектов, которые вы хотите получить в конце.

Artist.objects.annotate(played=Count('song__songplay')).order_by('-played')[:10]
Song.objects.annotate(played=Count('songplay')).order_by('-played')[:10]

Тогда запросы будут намного понятнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...