zoukankan      html  css  js  c++  java
  • 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.指定局部及全局钩子
    '''
    
  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12348033.html
Copyright © 2011-2022 走看看