(十一)Django Rest framwork序列化器(1)
2019-10-18 本文已影响0人
足__迹
当前 增删改查的痛点

Django Rest framwork(DRF)
-
特性:
image.png
安装&配置
-
安装
image.png
-
配置
image.png
-
序列化器
image.png
序列化器
1.在应用中创建serializer文件’

2.创建序列化类
from rest_framework import serializers
# 1,定义序列化类 继承serializer类或子类
class ProjectSerializer(serializers.Serializer):
'''
#创建序列化器类
'''
# label 相当与verbose_name help_text 与模型类中的完全一致
#需要输出那些字段,那么就在序列化中定义那些字段
id = serializers.IntegerField(label='ID')
name = serializers.CharField(label='项目名称', max_length=200, help_text='项目名称提示')
leader = serializers.CharField(label='负责人', max_length=50, help_text='负责人')
tester = serializers.CharField(label=' 测试人员', max_length=50, help_text='测试人员')
programer = serializers.CharField(label='开发人员', max_length=200, help_text='开发人员')
publish_app = serializers.CharField(label='发布应用', max_length=200, help_text='发布应用')
#allow_null 对应模型类中的null allow_blank对应模型类中的balank
desc = serializers.CharField(label='简要描述', help_text='发布应用', allow_blank=True, allow_null=True)
- 序列化
#序列化返回单个数据
def get(self,request,pk):
#获取前端传递的Pk值,类型是否为正整数,数据库中是否存在等
#获取指定pk的项目
project = Projects.objects.get(id =pk)
"""
1.通过模型类对象(或者查询集),传给Instance可进行序列化操作
2.通过序列化serializer对象data属性,就可以转换之后的字典
"""
serializer = ProjectSerializer(instance=project)
#序列换返回多个数据
def get(self, request):
# 获取数据库信息
project_qs = Projects.objects.all()
'''
序列化器如果返回多条数据 需要添加:many=True
'''
serialier = ProjectSerializer(instance=project_qs, many=True)
return JsonResponse(serialier.data,safe=False)

- 反序列化
def post(self, request):
'''
新增项目
:param request: 传入的参数
:return:
'''
# 获取前端传入的参数,转换为Python中的类型
# 为了严谨需要做校验,例如是否为json
# 1.
json_data = request.body.decode('utf-8')
python_data = json.loads(json_data, encoding='utf-8')
# 2.向项目中添加数据
serializer = ProjectSerializer(data=python_data)
"""
1,校验输入的数据,调用is_valid()开始校验前端输入的数据,成功Treu 失败False
2,raise_exception=True 校验失败会抛出异常,成功Treu
3,当调用is_valid 可以用 serializer.errors 获取错误信息
4. 校验成功的数据 可以用serializer.validated_data 获取
"""
try:
serializer.is_valid(raise_exception=True)
except Exception as e:
return JsonResponse(serializer.errors,safe=True)
project = Projects.objects.create(**serializer.validated_data)
serializer = ProjectSerializer(instance=project)
return JsonResponse(serializer.data)
-
验证成功:
image.png
-
验证失败
-
返回信息
image.png
-
-
获取错误信息
image.png
-
获取验证后的信息
image.png
设备序列器的校验
校验器的顺序
1.字节中的数据按照从左到右(先判断字符类型,然后判断长度,接着判断validators中的校验器)
2.字节外,先判断校验器外的校验
3.先校验单字节再校验多字节
- 校验唯一(项目名不重复)
1,使用自带的 UniqueValidator 判断
2, 错误显示:message中的提示文字
#判断输入的name是否重复
'''
name = serializers.CharField(label='项目名称', max_length=200, help_text='项目名称提示',validators=
[UniqueValidator(queryset=Projects.objects.all(),message='项目名不能重复'),is_unique_project_name])
- 单字节校验
- 方式一 (在序列器外部创建校验函数)
1,name 为需要校验的字段
2, 使用时需要添加到校验字段所属的validators中
3,使用serializers.ValidationError 返回报错的提示信息与message一致
4,不需要返回校验值
- 方式一 (在序列器外部创建校验函数)
def is_unique_project_name(name):
if len(name) <= 6:
raise serializers.ValidationError('项目名称必须大于6')

- 方法二(在序列器内部)
1.序列化类里面的校验器(以validate开头_字节名)
2.不需要加入所属的validators中
3.校验成功后必须返回校验值
def validate_name(self,value):
if not value.endswith('项目'):
raise serializers.ValidationError('必须是"项目"结尾')
return value
- 多字节校验
1,创建多字节校验删除validate(固定)
2,不需要加入所属的validators中
3,校验成功后必须返回校验值
def validate(self, attrs):
if 'icon' not in attrs['leader'] or 'icon' not in attrs['tester']:
raise serializers.ValidationError('测试和开发人员必须为icon')
return attrs