繁体   English   中英

如何在 Django Rest Framework 的列表视图集中显示名称而不是 pk?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM