美文网首页
(十一)Django Rest framwork序列化器(1)

(十一)Django Rest framwork序列化器(1)

作者: 足__迹 | 来源:发表于2019-10-18 13:42 被阅读0次

当前 增删改查的痛点

image.png

Django Rest framwork(DRF)

  • 特性:


    image.png

安装&配置

  • 安装


    image.png
  • 配置


    image.png
  • 序列化器


    image.png

序列化器

1.在应用中创建serializer文件’


image.png

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)

image.png
  • 反序列化
    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')
image.png
  • 方法二(在序列器内部)
    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

相关文章

网友评论

      本文标题:(十一)Django Rest framwork序列化器(1)

      本文链接:https://www.haomeiwen.com/subject/mcbumctx.html