基本上我有这样的模型:
class Playlist(models.Model):
key = models.CharField(max_length=255,blank=True, unique=True)
user = models.ForeignKey(User)
title = models.CharField(max_length=200)
pub_date = models.DateTimeField(auto_now_add=True)
videos = models.ManyToManyField(Video, through='PlaylistVideo')
class PlaylistVideo(models.Model):
playlist = models.ForeignKey(Playlist)
video = models.ForeignKey(Video)
position = models.IntegerField()
class Video(models.Model):
title = models.CharField(max_length=255,blank=True)
description = models.TextField(blank=True)
thumb = models.URLField(blank=True)
duration = models.IntegerField(default=0)
现在我想要一个API来像这样返回播放列表...但视频应该按PlaylistVideo模型中的位置排序
{
"key": "h8x3",
"title": "First Playlist",
"pub_date": "2012-10-11T17:00:26Z",
"videos": [
{
....
},
{
....
}
]
},
我该怎么做呢?
发布于 2015-07-06 22:05:44
我不太确定你是否已经解决了你的问题,但我自己也遇到过这个问题,并通过这样的方式让它工作起来:
创建一个自定义序列化程序,如下所示:
class PlaylistVideoSerializer(serializers.HyperlinkedModelSerializer):
title = serializers.ReadOnlyField(video.title)
description = serializers.ReadOnlyField(video.description)
thumb = serializers.ReadOnlyField(video.thumb)
duration = serializers.ReadOnlyField(video.duration)
class Meta:
# your associative entity here
model = PlaylistVideo
fields = ('title', 'description', 'thumb', 'duration')
在这里,我假设您想要显示视频实体/表下的所有字段。请随意调整以适应您的需求/喜好。
然后,您所需要做的就是
class PlaylistSerializer(serializers.ModelSerializer):
videos = PlaylistVideoSerializer(source='playlistvideo_set', many=True)
class Meta:
model = Playlist
fields = ('key', 'title', 'pub_dates', 'videos')
注意:始终确保源引用的是关联实体。否则你会得到一个空的json列表。
希望这篇文章能帮助那些面临类似问题的人。
发布于 2014-04-24 19:29:04
你可以这样做:
class PlaylistVideoList(generics.ListCreateAPIView):
serializer_class = PlaylistVideoSerializer
queryset = PlaylistVideo.objects.all().order_by('position')
在serializers.py中:
class PlaylistVideoSerializer(serializers.ModelSerializer):
class Meta:
model = PlaylistVideo
发布于 2012-12-29 22:19:50
我们真的需要添加一些关于“直通”关系的文档。
同时,下面的讨论可能会有所帮助:
https://groups.google.com/forum/#!topic/django-rest-framework/xzOhjILq3xA/discussion
https://stackoverflow.com/questions/14032783
复制相似问题