在django中制作简单可订购播放列表的最佳方法

时间:2011-01-25 22:03:49

标签: jquery django json orm playlist

简单的django问题:

我有一个非常典型的播放列表和曲目模型示例:

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,但如果你有一个不同的,简单的方式制作json,我很乐意听到它!)

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

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

但根据PlaylistTrack.position字段......

,这不会保留排序

谢谢!

2 个答案:

答案 0 :(得分:5)

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

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()

答案 1 :(得分: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)