【问题标题】:Best way to make a simple orderable playlist in django在 django 中制作简单的可订购播放列表的最佳方法
【发布时间】:2011-06-15 12:33:56
【问题描述】:

简单的 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 字段,这不会保留排序...

谢谢!

【问题讨论】:

    标签: jquery django json orm playlist


    【解决方案1】:

    如果您注意到您的 PlaylistTrack 模型只不过是一个 Many-2-Many 中间表,那么事情就会变得更加明显(检查 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)
    

    【讨论】:

    • 你确定你可以 simplejson.dump 一个模型吗?我在一个复杂的模型上尝试它,我得到一个“无法序列化为 JSON”的错误。也许那是因为我正在工作的复杂模型上尝试它?回家后我会尝试我的简单播放列表...
    • 我想它可以用django.core.serializers序列化?
    • 嗯,看来您可能无法直接使用 simplejson 进行操作。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2021-01-15
    • 2010-09-23
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多