2

簡単なジャンゴ orm の質問:

プレイリストとトラック モデルの非常に古典的な例があります。

class Track(models.Model):
    name = models.CharField(max_length = 50)
    mp3 =  models.FileField(upload_to="track/")

class Playlist(models.Model):
    name = models.CharField(max_length = 50)

class PlaylistTrack(models.Model):
    playlist = models.ForeignKey('track.Playlist')
    track =    models.ForeignKey('track.Track')
    position = models.IntegerField() #Here's the crux of the problem

これは、注文可能なプレイリストを作成する最良の方法ですか?

私はそれを疑いますが、もしそうなら、どうすれば注文を受け取ることができQuerySetますか? (私はjsonにシリアライズするので、aQuerySetが好まれますが、jsonを作成する別の簡単な方法があれば、ぜひ聞きたいです!)

これが私がこれまでに持っているものです:

playlist = Track.objects.filter(playlisttrack__playlist__exact=1)

しかし、フィールドによると、これは順序を保持しませんPlaylistTrack.position...

ありがとう!

4

2 に答える 2

5

PlaylistTrackモデルが多対多の中間テーブルにすぎないことに気付いた場合、状況はより明白になります (これを確認してください)。

class Playlist(models.Model):
    name = models.CharField(max_length = 50)
    tracks = models.ManyToManyField('Track', through='PlaylistTrack')

class PlaylistTrack(models.Model):
    playlist = models.ForeignKey('track.Playlist')
    track =    models.ForeignKey('track.Track')
    position = models.IntegerField() #Here's the crux of the problem

    class Meta:
        ordering = ['position']

これで、次のことができます。

my_playlist.tracks.all()
于 2011-01-25T23:55:55.330 に答える
2

心配な順序であれば、order_byクエリの最後に句を追加するだけです。

playlist = Track.objects.filter(playlisttrack__playlist__exact=1).order_by('+playlisttrack__position')

結果セットを json に単純にダンプするには:

json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(playlist, ensure_ascii=False, stream=response)
于 2011-01-25T23:10:29.283 に答える