• DRF之响应、序列化(三)


    drf响应类:Response

    # 查看Response的__init__方法
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
    '''
    data:响应的数据内容 - 空、字符串、数字、列表、字段、布尔值、字典
    status:网络状态码 - 默认为200
    template_name:drf可以支持前后台不分离返回页面(和data二选一)
    headers:响应头
    exception:是否是异常响应(如果是异常响应,可以将其赋值为True)
    content_type:响应的结果类型(如果响应data,默认就是application/json)
    '''
    Response(
        data={
            'status': 0,
            'msg': 'ok',
            'result': serializer.data
        }, status=status.HTTP_200_OK
    )
    
    

    序列化基类控制的init参数

    '''
    def __init__(self, instance=None, data=empty, **kwargs):
        pass
    
    instance:要被赋值的对象---> 对象类型数据赋值给instance
    data:是要被赋值的数据 ---> 请求来的数据赋值给data
    kwargs:内部有三个属性
    	- many:操作的对象或数据,是单个还是多个
    	- partial:在修改需求时使用,可以将所有校验字段required校验规则设置为False
    	- context:用于视图类和序列化类直接传参使用
    '''
    # 使用方式
    # 单查
    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)
    

    反序列化

    views.py
    '''
    1.将前台请求的数据交给序列化类处理
    2.序列化类执行校验方法,对前台提交的所有数据进行校验,校验失败就是一场返回
    3.序列化组件完成数据入库操作,得到入库对象
    4.响应结果给前台
    '''
    
    class UserAPIView(APIView):
        def post(self, request, *args, **kwargs):
            serializer = serializers.UserModelSerializer(data=request.data)
            
            # 校验数据是否合法
            if serializer.is_valid():
                obj = serializer.save()
                return Response(
                    data={
                        'status': 0,
                        'msg': 'ok',
                        'result': serializers.UserModelSerializer(obj).data
                    }, status=status.HTTP_201_CREATED)
            else:
                return Response(
                    data={
                        'status': 1,
                        'msg': 'data error', 
                        'errors': serializer.errors}
                )
    
    serializers.py
    '''
    1.不管是序列化还是反序列化字段,都必须在fields中进行声明,没有声明的数据不会参与任何过程(数据会被丢弃)
    2.用read_only 表示对象orm从数据库中取出 序列化的过程
    用write_only 表示前端Json数据--->orm对象的过程
    
    3.注意:
     - 在model类中用@property声明的字段,默认是read_only
     - 在serializer类中声明的字段,必须手动明确write_only(如果该字段是对model类中原有字段的覆盖,可以设置可读可写)
     - 原因分析:如果serializer中声明的字段没有明确write_only,则在序列化的过程中,orm对象里并没有该字段,序列化就会失败。
    
    4.用extra_kwargs可以为字段制定基础校验规则
    extra_kwargs = {
        'password': {
            'write_only': True,
            # 'max_length':8,
            # 'min_length':4,
        }
    }
    
    5.每一个写字段都可以用局部钩子validate_字段名(self,value)方法来自定义校验规则,成功return value,否则 raise exceptions.ValidationError('异常信息')
    
    6.需要联合校验的字段,用validate(self,attrs)方法来自定义校验规则,成功返回attrs,失败raise exceptions.ValidationError({'字段':'异常信息'})
    
    7.extra_kwargs中一些重要的限制条件
    	- required:代表是否必须参与写操作,有默认值或可以为空的字符,该值为False;反之该值为True;可以手动修改值
    '''
    

    实际开发中的运用

    '''
    1.在model类中自定义读字段,在serializer类中自定义写字段
    
    2.将model自带字段和所有字段写在fields中,用write_only和read_only区别model自带字段
    
    3.可以写基础校验规则,也可以省略
    
    4.指定局部及全局钩子
    '''
    
  • 相关阅读:
    虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’
    解决导入MySQL数据库提示"Unknown character set: 'utf8mb4'"错误
    在js中怎样获得checkbox里选中的多个值?
    CSharp设计模式读书笔记(0):设计原则(学习难度:★★☆☆☆,使用频率:★★★★★)
    how to install maven and svn plugin into eclipse 3.6
    三个月不编程,能力下降80%
    maven管理的struts2spring3mybatisfreemarker框架整合
    Wiki: JavaHL for subversion & ubuntu lucid
    重装系统要装的库包 for ubuntu lucid
    Q for Eclipse is an Apache Maven plugin for the Eclipse IDE
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12348033.html
Copyright © 2020-2023  润新知