The response DRF sequence of (c)

drf response class: 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
)

Sequence control base class init parameters

'''
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)

Deserialization

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;可以手动修改值
'''

The use of actual development

'''
1.在model类中自定义读字段,在serializer类中自定义写字段

2.将model自带字段和所有字段写在fields中,用write_only和read_only区别model自带字段

3.可以写基础校验规则,也可以省略

4.指定局部及全局钩子
'''

Guess you like

Origin www.cnblogs.com/Ghostant/p/12348033.html
Recommended