2012-03-02 40 views
0

在Django中,我有車型像這樣的應用程序:分組由一個ForeignKey和ForeignKeys是另一個「步」走

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] 

...讓高層10位藝術家。

有沒有更簡單的方法來實現這一目標?我不太喜歡指定values,我寧願按照(song_object, count)(artist_object, count)的順序得到元組。

有沒有什麼明顯的我錯過了?謝謝!

回答

1

您應該從最後想要獲取的對象開始構建查詢。

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

然後查詢會更清晰。

+0

這正是我要找的,謝謝。我沒有意識到你可以通過像'song__songplay'這樣的關係'計數'! – 2012-03-03 08:22:43