按外键分组,外键是另一个“步骤”

时间:2012-03-02 21:01:21

标签: python database django orm

在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()

我想能够制作播放次数最多的歌曲和播放次数最多的艺术家的图表。如何使用Django的ORM来执行GROUP BYCOUNT这样的操作?

目前,我正在做这样的事情:

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]

......获得前十名艺术家。

有没有更简单的方法来实现这一目标?我真的不想指定values,我宁愿得到(song_object, count)(artist_object, count)的元组。

我错过了一些明显的东西吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您应该从最终要获取的对象开始构建查询。

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

然后查询会更加清晰。