serializ中的Python Django modify字段

2024-10-01 15:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下设置:

我有一个基本的博客和文章关系,在这里我可以得到所有博客及其相关文章:

class BlogSerializer(serializers.ModelSerializer):

    articles = ArticleSerializer(many=True, read_only=True)

    class Meta:
        model = Blog
        fields = ('id', 'name', 'articles')
        depth = 0


class BlogViewSet(ViewSetMixin, GenericAPIView):

    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

现在我想保持现状,但是:

调用列表视图(例如api/blogs)时,只应发送文章的ID,因此我将viewset扩展为:

class BlogViewSet(ViewSetMixin, GenericAPIView, ..):

    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

    def get_serializer(self, *args, **kwargs):
        # pseudo code
        if self.context['request'].action == 'list':
            serializer = super(BlogViewSet, self).get_serializer(*args, *kwargs)
            serializer.fields['articles'] = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
            serializer.is_valid()
            return serializer

我只是想用PrimaryKeyRelatedField覆盖相应的articles字段,这样就只发送id了。你知道吗

但我得到的结果是空的(没有博客和文章),我不知道为什么。。。有什么想法或建议吗?你知道吗

谢谢和问候!你知道吗


Tags: selfidtrueonlyfieldsread文章blog
1条回答
网友
1楼 · 发布于 2024-10-01 15:36:02

试试这个

# serializers.py
class BlogSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.context['view'].action == 'list':
            self.fields['articles'] = ArticleSerializer(many=True, read_only=True)articles = ArticleSerializer(many=True, read_only=True)# remove this line

    class Meta:
        model = Blog
        fields = ('id', 'name', 'articles')
        depth = 0# remove this also....I don't think this is relevant here


# views.py
class BlogViewSet(ViewSetMixin, GenericAPIView):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer


我在这里所做的是,每当视图操作不是list时,通过重写__init__()方法,我们强制序列化程序将articles字段更改/映射到序列化程序ArticleSerializer。默认情况下,DRF将在这里采用PrimaryKeyRelatedField关系。

希望这有帮助!!你知道吗

相关问题 更多 >

    热门问题