Django rest framework 如何使用自定义逻辑创建序列化程序?

Django rest framework 如何使用自定义逻辑创建序列化程序?,django-rest-framework,Django Rest Framework,输入只有两个参数: param1=Int,可选 param2=Char,需要 在输出时-json,包含4个元素 key1=Char 键2=Int 键3=Int 键4=Int 一切都可以是空的 现在我已经在get方法的视图中实现了它,但是我想为它创建一个序列化器,并将所有的逻辑放在那里,但是我真的不知道在哪里传输逻辑-验证,到_表示 现在看起来像这样 视图.py class ExampleRetrieveApiView(APIView): def get(self, request, *a

输入只有两个参数:

  • param1=Int,可选
  • param2=Char,需要
  • 在输出时-
    json
    ,包含4个元素

  • key1=Char
  • 键2=Int
  • 键3=Int
  • 键4=Int
  • 一切都可以是空的

    现在我已经在
    get方法的视图中实现了它,但是我想为它创建一个
    序列化器
    ,并将所有的逻辑放在那里,但是我真的不知道在哪里传输逻辑-
    验证
    到_表示

    现在看起来像这样

    视图.py

    class ExampleRetrieveApiView(APIView):
        def get(self, request, *args, **kwargs):
            # A lot of logic related with input parameters.
            return Response({
                'key1': value1,
                'key2': value2,
                'key3': value3,
                'key4': value4
            })
    
    
    class ExampleRetrieveApiView(APIView):
        serializer_class = ExampleSerializer
    
        def get(self, request):
            serializer = ExampleSerializer(???)
            return Response(serializer.data)
    
    class ExampleSerializer(serializers.Serializer):
        ???
    
    我需要做些像这样的事情

    视图.py

    class ExampleRetrieveApiView(APIView):
        def get(self, request, *args, **kwargs):
            # A lot of logic related with input parameters.
            return Response({
                'key1': value1,
                'key2': value2,
                'key3': value3,
                'key4': value4
            })
    
    
    class ExampleRetrieveApiView(APIView):
        serializer_class = ExampleSerializer
    
        def get(self, request):
            serializer = ExampleSerializer(???)
            return Response(serializer.data)
    
    class ExampleSerializer(serializers.Serializer):
        ???
    
    序列化程序.py

    class ExampleRetrieveApiView(APIView):
        def get(self, request, *args, **kwargs):
            # A lot of logic related with input parameters.
            return Response({
                'key1': value1,
                'key2': value2,
                'key3': value3,
                'key4': value4
            })
    
    
    class ExampleRetrieveApiView(APIView):
        serializer_class = ExampleSerializer
    
        def get(self, request):
            serializer = ExampleSerializer(???)
            return Response(serializer.data)
    
    class ExampleSerializer(serializers.Serializer):
        ???
    

    将输入参数作为dict传递。然后,应使用SerializerMethodField()进行此操作:

    from rest_framework import serializers
    
    class ExampleSerializer(serializers.Serializer):
      key1 = serializers.SerializerMethodField()
      key2 = serializers.SerializerMethodField()
      key3 = serializers.SerializerMethodField()
      key4 = serializers.SerializerMethodField()
    
      def get_key1(self, obj):
        # do some calculations, let's say we want to return input1 multiplied by 2
        # I'm accessing obj data and if it's empty assigning 0, you can add your own check instead
        return obj.get('input1', 0)*2
    
      def get_key2(self, obj):
        # same deal, do whatever calculations you want with the input data
        return obj.get('input2')
    
      def get_key3(self, obj):
        # your logic
        return
    
      def get_key4(self, obj):
        return
    
    对于声明为SerializerMethodField的每个字段,都应该有一个对应的get\u field方法

    如何获取输入参数取决于您,您可以通过查询参数或主体数据来实现。 在视图中像这样调用序列化程序,例如使用body参数:

    类示例示例RetrieveApiView(APIView):

    视图

    class ExampleAPIView(APIView):
        serializer_class = ExampleSerializer
    
        def get(self, request):
            serializer = ExampleSerializer(data=request.query_params)
            if serializer.is_valid(raise_exception=True):
                return(Response(serializer.data))
    
    
    class ExampleSerializer(serializers.Serializer):
        param1 = serializers.IntegerField()
        param2 = serializers.CharField()
    
        def validate(self, data):
            #custom logic
            data['param3'] = 'text'
            #another params
            return data
    
        def to_representation(self, data):
            return {
                'key1': data['param3']
                'key2': data['param4']
                #another key for representation
            }
    
    序列化程序

    class ExampleAPIView(APIView):
        serializer_class = ExampleSerializer
    
        def get(self, request):
            serializer = ExampleSerializer(data=request.query_params)
            if serializer.is_valid(raise_exception=True):
                return(Response(serializer.data))
    
    
    class ExampleSerializer(serializers.Serializer):
        param1 = serializers.IntegerField()
        param2 = serializers.CharField()
    
        def validate(self, data):
            #custom logic
            data['param3'] = 'text'
            #another params
            return data
    
        def to_representation(self, data):
            return {
                'key1': data['param3']
                'key2': data['param4']
                #another key for representation
            }
    

    这也是可行的,但就我个人而言,我不会在validate中实现实际用于计算/转换输入的逻辑。验证的目的是以某种非标准的方式验证输入。在你的例子中,你实际上是在把输入转换成不同的东西。