【问题标题】:How can i use two serializers in an APIView?如何在 APIView 中使用两个序列化程序?
【发布时间】:2020-08-06 10:09:39
【问题描述】:

我有两个序列化程序。我想将 HelloSerializer 用于 POST 请求,将 SchemaSerializer 用于 Get 请求。在 def get 中,我想列出模型中的所有数据。我该怎么做?

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

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


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

我的 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
            )

我的模型.py

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

    def __str__(self):
        return self.name

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    像这样使用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
                )
    

    【讨论】:

      【解决方案2】:

      这很简单,只需覆盖get_serializer_class方法,根据请求方法返回序列化器类即可。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2021-09-05
        • 2018-12-21
        • 1970-01-01
        相关资源
        最近更新 更多