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

Posted

技术标签:

【中文标题】在 django 中制作简单的可订购播放列表的最佳方法【英文标题】:Best way to make a simple orderable playlist in 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 字段,这不会保留排序...

谢谢!

【问题讨论】:

【参考方案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 进行操作。我已经更新了我的答案。

以上是关于在 django 中制作简单的可订购播放列表的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

包含 HTML 中复选框列表的可滚动框

按日期时间的月/日订购 Django QuerySet?

Django Rest 订购自定义

MVC5/C# 中的可搜索下拉菜单

Django模板:如何通过每个字典的嵌套属性重新组合字典列表?

使用ivx的可滑动容器制作消息列表的一些经验总结