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.指定局部及全局钩子
'''