反序列化

本文深入探讨Django REST framework中序列化器的使用技巧,包括数据验证、反序列化、序列化器方法重写及数据保存更新流程。通过实例讲解如何在视图中运用序列化器进行数据处理,确保数据的准确性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1-视图中使用反序列化验证方法
  • 简单的字段限制验证

    • 获取前端数据

    • 赋值给序列化器 data= 解析后的前端数据

    • 验证 ser.is_valid() 出现在反序列化中

      • raise_exception=True会向前端返回HTTP 400 Bad Request响应。
  • 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。

    在获取反序列化的数据前,必须调用**is_valid()**方法进行验证,验证成功返回True,否则返回False。

    验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。

    验证成功,可以通过序列化器对象的validated_data属性获取数据。

2-序列化器中单一字段验证和多个字段验证方法的使用
  • 顺序:利用参数验证 --》使用单一字段验证 --》使用多个字段验证

  • 验证也可以修改数据内容

  • 单一字段验证validate_<field_name>

     def validate_btitle(self, value):
            if 'django' not in value.lower():
                raise serializers.ValidationError("错误提示")
            return value
    
  • 多个字段验证validate

    def validate(self, attrs):
            bread = attrs['bread']
            bcomment = attrs['bcomment']
            if bread < bcomment:
                raise serializers.ValidationError('错误提示')
            return attrs
    
  • 外链式验证 —》一般情况下是有成型的工具类才使用频繁

  • 在字段中添加validators选项参数,也可以补充验证行为

 btitle = serializers.CharField(label='名称', max_length=20, validators=[about_django])
    
 def about_django(value):
    if 'django' not in value.lower():
        raise serializers.ValidationError("错误提示")
3-序列化器中保存和更新数据方法的使用
  • 保存和更新过程中使用的数据是ser.validated_data 而不是ser.data

  • 如果使用ser.data可能出现数据错误

  • 保存

    • 序列化器中定义creat方法
    def create(self, validated_data):
        """新建"""
        return BookInfo.objects.create(**validated_data)
    
    • ser = BookModelSerialize(data=data_dict)
    • 在视图中调用ser.save()
  • 更新

    • 序列化器中定义update方法

          def update(self, instance, validated_data):
              # 更新数据
              # instance 要更新的数据对象
              instance.btitle = validated_data['btitle']
      
              instance.save()
      
              return instance
      
      
    • ser = BookSerializer(book, data=data_dict)

    • 在视图中调用ser.save()

4-反序列化过程中save方法原理说明
  • save方法根据参数判断调用create 还是 updata

  • 如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。

  • 在对序列化器进行save()保存时,可以额外传递数据,这些数据可以在create()和update()中的validated_data参数获取到

serializer.save(参数名=数据)

自己重写***serializer中的方法一定要给一个正确类型返回值,*否则会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值