2.drf- serializers (序列化器)

作用:

发送出去 要序列化 把python的对象转换为字符串

接受数据 要反序列化,把字符串转为python能操作的对象

from rest_framework import serializers

序列化基础使用:

1.字段声明

class Student1Serializer(serializers.Serializer):
  # 1.要转换的数据声明
    id=serializers.IntegerField()
    name=serializers.CharField()
    sex=serializers.BooleanField()
    age=serializers.IntegerField()
    description=serializers.CharField()

2.编写视图函数

class StundentView(View):
    def get(self,request):
        #1.获取数据库中的数据集
        student_list=Stundet.objects.all()
        #2.实例化序列化器,得到序列化对象
        serializer=Student1Serializer(instance=student_list,many=True) #设置many=True,表示要序列化多个对象
        #3.调用序列化对象属性方法获得转换后的数据
        data=serializer.data

        #4.返回json响应数据
        return JsonResponse(data=data,status=200,safe=False)

3.添加路由

urlpatterns = [
path('student1/',views.StundentView.as_view())
]

#序列化器学习1

结果

![image-20220921182222128](drf- serializers (序列化器).assets/image-20220921182222128.png)

实例化serializer对象说明

![image-20220921183325062](drf- serializers (序列化器).assets/image-20220921183325062.png)

反序列化基础使用:

1.字段声明

class Student2Serializer(serializers.Serializer):
  # 1.要转换的数据声明
    id=serializers.IntegerField(read_only=True) #只在序列化时提交数据 反序列化不提交
    name=serializers.CharField(required=True)#反序列化提交时必填
    sex=serializers.BooleanField(default=True) #反序列化时,客户没提交就用默认值
    age=serializers.IntegerField(max_value=120 ,min_value=0,error_messages={'min_value':"超过最小值"}) #反序列化提交时设置最大值最小值
    description=serializers.CharField(allow_null=True,allow_blank=True)#提交时允许为空

2.自定义验证数据

(写在serializers.py)

1.验证来自客户端的所有数据
def validate(self, attrs):
    #验证来自客户端的所有数据,attrs是序列化器实例化时,传递的data选项数据
    if attrs.get('name')=='lly' and not attrs.get('sex'):
        raise serializers.ValidationError(detail='女性罗某不能入内', code='validate')
    return attrs
2.验证单个字段
def validate_name(self,data):
    #验证单个字段 方法名的格式必须是 validate_<字段名> 
    if data in ['python','django']:
      raise serializers.ValidationError(detail='学生名不能是python或django',code='validate_name')
    return data
3.validators 外部验证函数选项
 def check_classment(data):
    #外部验证函数
    if len(data) !=3:
        raise serializers.ValidationError(detail='班级格式不正确!',code=check_classment)
    return data
    
classmeta=serializers.CharField(validators=[check_classment])# 调用外部验证函数check_classment

3.编写视图函数

反序列化-采用字段选项验证数据(验证失败不抛出异常)

    def get(self,request):
        # 反序列化-采用字段选项验证数据(验证失败不抛出异常)

        # 1.接收客户端提交的数据
        #data=json.dumps(request.body)
        # 模拟来自客户端的数据
        data={
            "name":'hyq',
            "age":12,
            "sex":True,
            "classmate":'301',
            "description":'这里没有dyd'
        }
        #1.1 实例化序列化器,获取序列化对象
        serializer=PersonSerializer(data=data)
        #1.2 调用序列化器进行数据验证
        ret=serializer.is_valid()#raise_exception=True 如果数据反序列化错误,抛出异常,不会继续向下进行
        #1.3 获取验证后的结果
        if ret:
            return JsonResponse(dict(serializer.validated_data))
        else:
            return JsonResponse(dict(serializer.errors))
        #2.操作数据库

        #3.返回数据
        #return JsonResponse({})

反序列化-采用字段选项验证数据(错误抛出异常,常用)

    def get(self, request):
        # 反序列化-采用字段选项验证数据(错误抛出异常,常用)
        # 1.接收客户端提交的数据
        # data=json.dumps(request.body)
        # 模拟来自客户端的数据
        data = {
            "id":2,
            "name": 'pytho1n',
            "age": 12,
            "sex": True,
            "classmeta": '301',
            "description": '这里没有dyd'
        }
        # 1.1 实例化序列化器,获取序列化对象
        serializer = PersonSerializer(data=data)
        # 1.2 调用序列化器进行数据验证
        serializer.is_valid(raise_exception=True)  # raise_exception=True 如果数据反序列化错误,抛出异常
        # 1.3 获取验证后的结果
        print(serializer.validated_data)

        # 2.操作数据库

        # 3.返回数据
        return JsonResponse(dict(serializer.validated_data))

更新与保存数据

(Serializers类中的create和update方法)

1.保存数据(create)

    def create(self, validated_data):
        # 向数据库添加数据操作 方法名固定为create,固定参数validated_data就是验证后的结果

        student = User.objects.create(**validated_data)
        return student
    def get(self, request):  # 反序列化完成后 添加数据入库
        # 1.接收客户端提交的数据
        # data=json.dumps(request.body)
        # 模拟来自客户端的数据
        data = {
            "name": '2lly',
            "age": 12,
            "sex": True,
            "classmeta": '301',
            "description": '这里没有dyd',
            "id": 102,
            "haha": "helo"
        }
        # 1.1 实例化序列化器,获取序列化对象
        serializer = PersonSerializer(data=data)
        # 1.2 调用序列化器进行数据验证
        serializer.is_valid(raise_exception=True)  # raise_exception=True 如果数据反序列化错误,抛出异常

        # 2.获取验证后的结果后,操作数据库
        serializer.save()
        '''
         会根据实例化序列化器时,是否传入instance属性来自动调用create或update方法
         传入instance属性,调用update,没传入instance属性,调用create
        '''
        # 3.返回数据
        return JsonResponse(dict(serializer.data))

2.提交数据(update)

    def update(self, instance, validated_data):
        # 更新数据操作,方法名固定为update 固定参数instance为实例化序列化器对象时,必须传入的模型对象 validated_data为验证成功后的结果
        # 更新数据后 自动实现从字典数据变成模型对象的过程
        instance.name = validated_data.get('name')
        instance.age = validated_data.get('age')
        instance.sex = validated_data.get('sex')
        instance.classmate = validated_data.get('classmate')
        instance.description = validated_data.get('description')
        instance.save()
        return instance
    def get(self,request): #反序列化完成后 更新数据入库
        #1.根据客户端访问的url地址获取pk值
      	# 模拟pk值
        pk=1
        try:
            student=User.objects.get(pk=pk)
        except User.DoesNotExist:
            return JsonResponse({"errors":'当前学生不存在'},status=400)
        # 2.接收客户端提交的数据
        #data=json.dumps(request.body)
        # 模拟来自客户端的数据
        data={
            "name":'2222ly',
            "age":77,
            "sex":True,
            "classmeta":'301',
            "description":'这里没有ggg',
            "haha":"helo"
        }
        #3 修改操作中的实例化序列化器
        serializer=PersonSerializer(instance=student,data=data)
        #4 数据验证
        serializer.is_valid(raise_exception=True)#raise_exception=True 如果数据反序列化错误,抛出异常

        #5.保存数据库
        serializer.save()
        '''        
         会根据实例化序列化器时,是否传入instance属性来自动调用create或update方法
         传入instance属性,调用update,没传入instance属性,调用create
        '''
        #6.返回数据
        return JsonResponse(dict(serializer.data))

ModelSerializer

class PersonModelSerializer(serializers.ModelSerializer):
    # 1.要转换的数据声明 如果是继承的ModelSeralizer,则需要声明调用的模型信息
    class Meta:
        model=User #必填
        fields="__all__" #必填
        read_only_fields=['id'] #选填 只读列表,只会在序列化阶段采用
        extra_kwargs={ #选填 字段额外声明
        "age":{
            "min_value":5,
            "max_value":120,
            "error_messages":{
                "min_value":'年龄最小值大于等于5',
                "max_value":'年龄最大值小于等于120'
            }
        },
        }

    '''
    2.数据验证方法
    '''
    def validate(self, attrs):
      # 验证来自客户端的所有数据,attrs是序列化器实例化时,传递的data选项数据
      if attrs.get('name') == 'lly' and not attrs.get('sex'):
        raise serializers.ValidationError(detail='女性罗某不能入内', code='validate')
      return attrs


    def validate_name(self, data):
      # 验证单个字段 方法名的格式必须是 validate_<字段名>
      if data in ['python', 'django']:
        raise serializers.ValidationError(detail='学生名不能是python或django', code='validate_name')
      return data

    '''
    3.模型操作方法
    '''
    def create(self, validated_data):
        # 向数据库添加数据操作 方法名固定为create,固定参数validated_data就是验证后的结果

        student = User.objects.create(**validated_data)
        return student

    def update(self, instance, validated_data):
        # 更新数据操作,方法名固定为update 固定参数instance为实例化序列化器对象时,必须传入的模型对象 validated_data为验证成功后的结果
        # 更新数据后 自动实现从字典数据变成模型对象的过程
        instance.name = validated_data.get('name')
        instance.age = validated_data.get('age')
        instance.sex = validated_data.get('sex')
        instance.classmate = validated_data.get('classmate')
        instance.description = validated_data.get('description')
        instance.save()
        return instance
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值