Как я могу использовать два сериализатора в APIView? - PullRequest
1 голос
/ 23 апреля 2020

У меня есть два сериализатора. Я хочу использовать HelloSerializer для запроса POST и SchemaSerializer для запроса Get. По умолчанию я хочу перечислить все данные в моей модели. Как мне это сделать?

class SchemaSerializer(serializers.ModelSerializer):
    """Serializes Schema"""

    class Meta:
        model = models.Schema
        fields = (  'id', 'name', 'version')


class HelloSerializer(serializers.Serializer):
    name = serializers.CharField()

my Views.py:

class HelloApiView(APIView):
    """Test API View"""
    serializer_class = serializers.HelloSerializer

    def get()

    def post(self, request):
        """Create a hello message with our name"""
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            name = serializer.validated_data.get('name')
            message = f'Hello {name}!'
            return Response({'message': message})
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
            )

my models.py

class Schema(models.Model):
    """Database model for Schema """
    name= models.TextField()
    version = models.TextField()

    def __str__(self):
        return self.name

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

используйте get_serializer_class функцию, подобную этой

class HelloApiView(APIView):
    """Test API View"""
    serializer_class = serializers.HelloSerializer

    def get_serializer_class(self):
        if self.request.method == 'POST':
           return YOUR_SERIALIZER_1
        elif self.request.method == 'GET':
           return YOUR_SERIALIZER_2
        else:
            return YOUR_DEFAULT_SERIALIZER

    def get()

    def post(self, request):
        """Create a hello message with our name"""
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            name = serializer.validated_data.get('name')
            message = f'Hello {name}!'
            return Response({'message': message})
        else:
            return Response(
                serializer.errors,
                status=status.HTTP_400_BAD_REQUEST
            )
1 голос
/ 23 апреля 2020

Это довольно просто сделать, просто переписать метод get_serializer_class, чтобы вернуть класс сериализатора на основе метода запроса.

class HelloApiView(APIView):

    def get_serializer_class(self):
        if self.request.method.lower() == "get":
            return MyApiControllerGetSerializer 
        else:
            return MyApiControllerSerializer   
...