【问题标题】:Use different serializer for request and reply使用不同的序列化器进行请求和回复
【发布时间】:2018-07-06 09:22:21
【问题描述】:

我可以为POST / GET 请求使用不同的序列化程序,如下所示:

class CommandViewSet(DynamicModelViewSet):
    queryset = Command.objects.all()
    serializer_class_post = CommandSerializerPost
    serializer_class_get = CommandSerializerGet
    permission_classes = (AllowAny,)

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return self.serializer_class_post
        elif self.request.method == 'GET':
            return self.serializer_class_get

现在我想为POST 请求的requestreply 使用不同的序列化程序。这如何实现?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以为此覆盖序列化程序的 to_representation() 方法:

    class CommandSerializerPost(serializers.ModelSerializer):
        # yur code here
    
        def to_representation(self, instance):
            serializer = CommandSerializerGet(instance)
            return serializer.data
    

    UPD

    在上面的代码中,CommandSerializerPost始终返回 CommandSerializerGet 的输出,而与 request.method 无关。所以如果你只需要更改GET请求的响应应该是这样的:

    class CommandSerializerPost(serializers.ModelSerializer):
    
        def to_representation(self, instance):
            if self.context['request'].method == 'GET':
                serializer = CommandSerializerGet(instance)
                return serializer.data
            return super().to_representation(instance)
    

    【讨论】:

    • @dangonfast 是的,您可以从您的视图中删除 get_serializer_class 方法。 to_representation 也会自动用于获取请求。我只能找到这个链接:django-rest-framework.org/api-guide/serializers/#baseserializer
    • @JerinPeterGeorge 感谢您的编辑,但我想 OP 想要更改所有类型请求的输出,甚至是 POST。所以我留下了这两种变体。
    • 再次错字,更改 //在上面的代码中,CommandSerializerPost 将始终返回 CommandSerializerPost 的输出 // 到 //在上面的代码中,CommandSerializerPost 将始终返回 CommandSerializerGet // 的输出
    • @JerinPeterGeorge 啊!再次感谢:)
    • @JerinPeterGeorge 在某些情况下,您需要发布一个字段并接收另一个字段。我认为是这种情况。
    【解决方案2】:

    您可以通过 MySerializer1 接收数据并通过 MySerializer2 响应请求

    Class MyView(APIView):
        def post(selft, request):
            serializer1 = MySerializer1(request.data)
            # other codes
            serializer2 = MySerializer2(changedData)
            return response(serializer2.data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 2018-10-10
      • 2016-02-11
      • 2020-05-12
      • 2021-07-07
      相关资源
      最近更新 更多