内部类、响应类Response、序列化基类、反序列化、全局局部钩子

一、内部类

1、概念:将类定义在一个类的内部,被定义的类就是内部类
2、特点:内部类及内部类的所以名称空间,可以直接被外部类访问的
3、 应用:通过内部类的名称空间,给外部类额外拓展一些特殊的属性(配置),典型的Meta内部类 - 配置类

class Book(model.Model):
         class Meta:
                 db_model = "owen_book"                # 配置自定义表名

class BookSerializer(serializers.ModelSerializer):
          class Meta:

                  model = "Book"                             # 配置序列化类绑定的Model表

 

 结果:

 列子:特点:内部类及内部类的所以名称空间,可以直接被外部类访问的

 

 

 二、DRF响应类:Response

1、源码:

def __init__(self, data=None, status=None, template_name=None, headers=None, exception=False, content_type=None):
        pass
2、源码中的参数:
             data:响应的数据 - 空、字符串、数字、列表、字段、布尔
             status:网络状态码
             template_name:drf说自己也可以支持前后台不分离返回页面,但是不能和data共存(不会涉及)
             headers:响应头(不用刻意去管)
             exception:是否是异常响应(如果是异常响应,可以赋值True,没什么用)
             content_type:响应的结果类型(如果是响应data,默认就是application/json,所有不用管)

3、常见使用
return Response(
     data={
            'status': 0,
            'msg': 'ok',
            'result': '正常数据'
            }
            )

 

return Response(
        data={
            'status': 1,
            'msg': '客户端错误提示',
             },
       status=status.HTTP_400_BAD_REQUEST,
       exception=True
)

响应类源码:最重要的是data和status

例子:设置网络状态码

 

 

 结果:

 三、序列化基类(BaseSerializer)

1、源码:
def __init__(self, instance=None, data=empty, **kwargs):
         pass

2、源码中的参数:

          instance:是要被赋值对象的 - 对象类型数据赋值给instance
          data:是要被赋值数据的 - 请求来的数据赋值给data
          kwargs:内部有三个属性:many、partial、context
          many:操作的对象或数据,是单个的还是多个的
          partial:在修改需求时使用,可以将所有校验字段required校验规则设置为False
          context:用于视图类和序列化类直接传参使用
图片:

3、 常见使用
       # 单查接口
       UserModelSerializer(instance=user_obj)

      # 群查接口
       UserModelSerializer(instance=user_query, many=True)

      # 增接口
       UserModelSerializer(data=request.data)

       # 整体改接口
       UserModelSerializer(instance=user_obj, data=request.data)

       # 局部改接口
       UserModelSerializer(instance=user_obj, data=request.data, partial=True)

       # 删接口,用不到序列化类

四、反序列化

1、views.py文件中

class UserAPIView(APIView):
    def post(self, request, *args, **kwargs):
        # 单增
        # 1)将前台请求的数据交给序列化类处理
        # 2)序列化类执行校验方法,对前台提交的所有数据进行数据校验:校验失败就是异常返回,成功才能继续
        # 3)序列化组件完成数据入库操作,得到入库对象
        # 4)响应结果给前台
        serializer = serializers.UserModelSerializer(data=request.data)
        if serializer.is_valid():
            # 校验成功 => 入库 => 正常响应
            obj = serializer.save()
            return Response({
                'status': 0,
                'msg': 'ok',
                'result': '新增的那个对象'
            }, status=status.HTTP_201_CREATED)
        else:
            # 校验失败 => 异常响应
            return Response({
                'status': 1,
                'msg': serializer.errors,
            }, status=status.HTTP_400_BAD_REQUEST)

 

 

 

2、is_valid() 源码:

    断言(assert): 其实就是等于  if...raise error 

 

 

 3、.save() 源码:

4、提交post请求:

 

 

 错误原因:

5、serializer 反序列化 分析:

 

 

 

 

第一波分析:

 第二波分析

 

 

 

 第三波 自定义反序列化字段

01、自定义只写字段,在serializer类中声明,必须手动明确write_only

 

 

02、自定义只读字段,在model类中用@property声明,默认就是read_only

 

6、全部、局部钩子(用来筛选条件的)

 

 

 

 

 

posted @ 2020-02-19 17:06  薛定谔的猫66  阅读(472)  评论(0)    收藏  举报