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

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

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

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

但根据PlaylistTrack.position字段,这不会保留排序……

谢谢!

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

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

如果您担心的顺序只是在查询结尾添加一个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)