Restframework之CreateApiview源码流程

1.接口代码调用流程

  #1.入口,子类继承CreateAPIView
  class IssueIdea(CreateAPIView):                   
      pass  

  #2.调用 CreateAPIView.post
     class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):
           def post(self, request, *args, **kwargs):
               return self.create(request, *args, **kwargs)

  #3.post调用create方法,根据继承顺序执行CreateModelMixin.create
               def perform_create(self, serializer):
                      #校验成功后保存
                      serializer.save()

               def get_success_headers(self, data):

               def create(self, request, *args, **kwargs):
                      ...

  #4.CreateModelMixin.create

         #4.1 将前端数据传入序列化器进行校验
              #GenericAPIView,返回序列化器类名
              def get_serializer(self, *args, **kwargs):
                        ....
                    return self.serializer_class #子类需要定义序列化器
              #校验
              serializer = self.get_serializer(data=request.data)
         #4.2 验证成功保存数据
          
              #传入序列化器进行保存
              self.perform_create(serializer)

              #调用CreateModelMixin.perform_create保存
               def perform_create(self, serializer): #!子类可重写此方法自定义保存
                   serializer.save()
                   #4.2.1 序列化器 save方法
                          save():
                                self.create(validated_data) #create子类需要自定义,否则抛出异常(在此方法中自定义保存)
  #5.serializer.create
              #调用自定义的序列化器create方法进行保存

2.序列化器

  class CreateNewsTopicModelSerializer(serializers.ModelSerializer):
        ...
  class CreateNewsModelSerializer(serializers.ModelSerializer):
      images = CreateNewsTopicModelSerializer(many=True)#嵌套序列化器,需要验证多个对象

      class Meta:...             
      def create(self, validated_data):
          #自定义保存,此校验涉及两张表,需要保存两个对象,可在create方法中自定义保存。
          
           return news_obj  #response返回值

简单梳理下调用流程:

  1.子类继承CreateApiview((mixins.CreateModelMixin,GenericAPIView)
        1.1 请求进来调用CreateApiview.post方法
              1.1.1 post方法调用父类 CreateModelMixincreate.create
                    1.1.1.1  CreateModelMixincreate.create
                             -- 1.调用 GenericAPIView.get_serializer(将前端数据传入序列化器进行校验)
                                      -- get_serializer 获取 子类序列化器类名
                             -- 2.调用 CreateModelMixincreate.perform_create 
                                      -- perform_create 
                                            -- 调用serializer.save(**kwargs)     ##save函数:将所有字段的数据放在validated_data用于create保存
                                                  --  save调用create方法(如果需要保存多个表对象,子类序列化器可自定义)
                                                        -- create方法自定义保存数据

使用

  如果不需要添加额外字段,视图子类只需要定义 
        [serializer_class = 自定义序列化器]就可保存数据
  4.前端传递json
      若前端传递格式为{
                       K1:V1,
                       K2:{} or [] ##此字段可使用嵌套序列化器   
                          }

预留钩子,可自定制

  1.post方法可自定义(处理post请求)
      def post(self, request, *args, **kwargs):
          ......自定义操作
          return self.create(request, *args, **kwargs) #必须调用create方法
  2.perform_create(调用save方法)
      def perform_create(self, serializer):
          "传入序列化器,在调用serializer.save"
          new_obj = serializer.save(**kwargs)  #此处可传入表中的特殊字段值
          return new_obj

  3. 序列化器
       3.1 serializer.save(**kwargs)  #(封装用于保存的所有字段)
           #save中validated_data封装了 {
                                      list(self.validated_data.items()) +  //验证 通过的字段
                                      list(kwargs.items()) )               //save传入的额外字段(**kwargs)
                                     }

       3.2 serializer.create(真正保存数据步骤,子类必须重写)
            def create(self, validated_data):
               #自定义部分......
               #执行orm创建数据操作时,传入的是 validated_data
               return Response(返回值)
  4. 获取序列化器种类
        若接口接受两种请求,子类重写self.get_serializer方法根据请求种类来获取不同序列化器
        get_serializer(self,request):
              if request.method = "post":
                    return ..
              if request.method = "post":
                    return ..
posted @ 2020-05-27 20:12  南山玄雾隐  阅读(337)  评论(0)    收藏  举报