Используйте другой сериализатор для запроса и ответа - PullRequest
0 голосов
/ 06 июля 2018

Я могу использовать разные сериализаторы для 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 запроса. Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы можете получить данные MySerializer1 и ответ на запрос MySerializer2

Class MyView(APIView):
    def post(selft, request):
        serializer1 = MySerializer1(request.data)
        # other codes
        serializer2 = MySerializer2(changedData)
        return response(serializer2.data)
0 голосов
/ 06 июля 2018

Вы можете переопределить метод 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)
...