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

2019-10-18  本文已影响0人  足__迹

当前 增删改查的痛点

image.png

Django Rest framwork(DRF)

安装&配置

序列化器

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)

设备序列器的校验

校验器的顺序
1.字节中的数据按照从左到右(先判断字符类型,然后判断长度,接着判断validators中的校验器)
2.字节外,先判断校验器外的校验
3.先校验单字节再校验多字节

#判断输入的name是否重复
    '''
    name = serializers.CharField(label='项目名称', max_length=200, help_text='项目名称提示',validators=
    [UniqueValidator(queryset=Projects.objects.all(),message='项目名不能重复'),is_unique_project_name])
def is_unique_project_name(name):
    if len(name) <= 6:
        raise serializers.ValidationError('项目名称必须大于6')
image.png
    def validate_name(self,value):
        if not  value.endswith('项目'):
            raise serializers.ValidationError('必须是"项目"结尾')
        return value
    def validate(self, attrs):
        if 'icon' not in  attrs['leader'] or 'icon' not in attrs['tester']:
            raise serializers.ValidationError('测试和开发人员必须为icon')
        return attrs
上一篇 下一篇

猜你喜欢

热点阅读