![](/img/trans.png)
[英]Paginating a list returned by a ViewSet in Django Rest Framework
[英]How to display the names instead of pk in the list viewset in Django Rest Framework?
我设计了一个 API 来添加歌曲和创建播放列表。
模型.py:
class Song(models.Model):
title = models.CharField(null=False, blank=False, max_length=400)
artist = models.CharField(null=False, blank=False, max_length=400)
def __str__(self):
return f"{self.title} by {self.artist}"
class Playlist(models.Model):
name = models.CharField(null=False, blank=False, max_length=100)
songs = models.ManyToManyField('Song', blank=True, related_name='playlists')
序列化程序.py:
class SongSerializer(serializers.ModelSerializer):
class Meta:
model = Song
fields = ['title', 'artist']
extra_kwargs = {'playlists': {'required':False}}
class PlaylistSerializer(serializers.ModelSerializer):
class Meta:
model = Playlist
fields = ['name', 'songs']
extra_kwargs = {'songs':{'required':False}}
视图.py:
class SongViewSet(viewsets.ModelViewSet):
queryset = Song.objects.all()
serializer_class = SongSerializer
class PlaylistViewSet(viewsets.ModelViewSet):
queryset = Playlist.objects.all()
serializer_class = PlaylistSerializer
但是当我在播放列表上执行获取请求时,我得到的结果如下:
{
"name": "Classic Hits",
"songs": [
1,
3,
4
]
}
我希望在播放列表中显示歌曲的名称而不是它们的 PK。我该怎么做?
由于您没有在Playlist
中指定Songs
的反序列化方式,因此会返回主键。 你可以试试:
class PlaylistSerializer(serializers.ModelSerializer):
songs = SongSerializer(many=True)
class Meta:
model = Playlist
fields = ['name', 'songs']
extra_kwargs = {'songs':{'required':False}}
对于嵌套对象的创建/更新:
By default nested serializers are read-only. If you want to support write-operations to a nested serializer field you'll need to create create() and/or update() methods in order to explicitly specify how the child relationships should be saved.
您可以修改 PlayListSerializer 的创建/更新方法:
class PlaylistSerializer(serializers.ModelSerializer):
songs = SongSerializer(many=True)
class Meta:
model = Playlist
fields = ['name', 'songs']
extra_kwargs = {'songs':{'required':False}}
def create(self, validated_data):
songs_data = validated_data.pop('songs')
playlist = Playlist.objects.create(**validated_data)
for song_data in song_data:
Song.objects.create(**song_data)
return playlist
请参阅文档中的嵌套关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.