2

简单的 django 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,因此QuerySet首选 a,但如果您有不同的、简单的制作 json 的方法,我很想听听!)

这是我到目前为止所拥有的:

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

但这并不能保留排序,根据PlaylistTrack.position现场......

谢谢!

4

2 回答 2

5

如果您注意到您的PlaylistTrack模型只不过是一个 Many-2-Many 中间表,那么事情会变得更加明显(检查这个):

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 回答