在 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 中制作简单的可订购播放列表的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章