使用不同的序列化程序进行请求和回复

dan*_*ast 5 django django-rest-framework

我可以为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
Run Code Online (Sandbox Code Playgroud)

现在我想用一个不同的序列化的请求应答一个的POST请求。如何做到这一点?

nev*_*ner 10

您可以to_representation()为此重写序列化器的方法:

class CommandSerializerPost(serializers.ModelSerializer):
    # yur code here

    def to_representation(self, instance):
        serializer = CommandSerializerGet(instance)
        return serializer.data
Run Code Online (Sandbox Code Playgroud)

UPD

在上面的代码CommandSerializerPost无论. 因此,如果您只需要更改请求的响应,则应该是这样的:CommandSerializerGetrequest.methodGET

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)
Run Code Online (Sandbox Code Playgroud)


Moh*_*Ali 5

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

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