在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 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]
......获得前十名艺术家。
有没有更简单的方法来实现这一目标?我真的不想指定values
,我宁愿得到(song_object, count)
和(artist_object, count)
的元组。
我错过了一些明显的东西吗?谢谢!
答案 0 :(得分:1)
您应该从最终要获取的对象开始构建查询。
Artist.objects.annotate(played=Count('song__songplay')).order_by('-played')[:10]
Song.objects.annotate(played=Count('songplay')).order_by('-played')[:10]
然后查询会更加清晰。