3

次のように、人々のリスニング習慣(Last.fmに少し似ています)を記録する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)
    user = models.ForeignKey(User)
    time = models.DateTimeField()

class User(models.Model):
    # doesn't really matter!

過去1か月に聴いたトップソングを表示できるユーザーページが欲しいのですが。これを行うための最良の方法は何ですか?

私がこれまでに思いついた最高のものは次のとおりです。

SongPlay.past_month
    .filter(user=user)
    .values('song__title', 'song__id', 'song__artist__name')
    .annotate(plays=Count('song'))
    .order_by('-plays')[:20]

past_monthは先月のプレイをフィルタリングするだけのマネージャーです。userフィルタリングするための正しいオブジェクトもすでにあると仮定します。

私の2つの質問は次のとおりです。

  • plays元のオブジェクトと注釈にアクセスするにはどうすればよいですか?
    これは、私がに渡すものに基づいて、特定の値を与えるだけですvalues。元のオブジェクトにアクセスしたいのですが、モデルには呼び出したいメソッドがあります。

  • SongPlayからにグループ化するにはどうすればよいArtistですか? アーティストのチャートと曲のチャートを見せたいのですが。

4

2 に答える 2

4

valuesとの両方で同じフィールドを使用できますannotate

オブジェクトの主キーがあるので(の代わりにSong使用できます)、songsong__id

Song.objects.get(id=...)

2番目の質問についてはsong__artist、フィールドとしてvaluesannotate:を使用して別のクエリを実行します。

from django.db.models import Count

SongPlay.past_month
    .filter(user=user)
    .values('song__artist')
    .annotate(plays=Count('song__artist'))
    .order_by('-plays')[:20]
于 2012-04-16T21:04:12.527 に答える
0

agfは、song_artistでグループ化する方法をすでに示しています。実際のSongオブジェクトを取得するために私が行うことは、それをmemcachedに格納することです。または、呼び出すメソッドがかなり単純な場合は、静的メソッドまたはクラスメソッドにします。クエリのデータを使用してSongオブジェクトを初期化し、実際に保存せずにこのメソッドにアクセスすることもできます。Songオブジェクトから呼び出したいメソッドの詳細を知るのに役立つかもしれません。

于 2012-04-16T22:02:54.610 に答える