首页 > 解决方案 > 嵌套序列化程序 Django REST Framework 时排除字段

问题描述

序列化程序.py

class ThreadSerializer(serializers.ModelSerializer):

    author = UserSerializer(read_only=True)
    last_post_user = UserSerializer(read_only=True)

    class Meta:
        model = Thread
        fields = '__all__'
        read_only_fields = ('locked', 'views', 'post_count', 'last_post_time')


class ChannelSerializer(serializers.ModelSerializer):

    threads = ThreadSerializer(many=True, read_only=True)

    class Meta:
        model = Channel
        fields = ['id', 'name', 'description', 'category', 'threads']


class CategorySerializer(serializers.ModelSerializer):

    channels = ChannelSerializer(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ['id', 'name', 'channels']

您会注意到我在CategorySerializer中嵌套了ChannelSerializer,当我访问使用CategorySerializer查询数据的端点时,我希望它只列出来自ChannelSerializer的数据,但是它也列出了来自ThreadSerializer的数据,我认为这是预期的行为,因为ThreadSerializer嵌套在ChannelSerializer中。

当我嵌套序列化程序时,有什么优雅的方法可以排除字段吗?在这种情况下,我想在使用CategorySerializerthreads查询数据时排除出现

图片

我尝试了类似问题的答案,但不幸的是,它似乎无法在我的情况下工作,它最终再次列出了线程,我认为有一种更简单的方法可以做到这一点。

标签: pythondjangodjango-rest-framework

解决方案


创建一个不同的序列化程序并删除您不想要的字段(请参阅此答案)是一个更好的选择,但这里有一个替代方案:

class CategorySerializer(serializers.ModelSerializer):

    channels = ChannelSerializer(many=True, read_only=True)

    # Override so we can remove unwatned fields
    def to_representation(self, instance):
        rep = super().to_representation(instance)
        del rep["channels"]["threads"]
        return rep

    ...

在这种情况下,“threads”键不会出现在 API 的响应中,但为每个通道返回线程的查询仍将运行(换句话说,它可以工作,但性能较差)。


推荐阅读