DRF框架---反序列化

反序列化

流程:

1. 写一个字典
2.  创建序列化器对象 把字典传入进去
3.  验证
4.  保存

序列化器代码:

class PeopleInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='ID')
    name = serializers.CharField(label='名字')
    password = serializers.CharField(label='密码')
    description = serializers.CharField(label='描述信息')

使用:

# 创建一个字典
data = {
     'id': 20,
     'name': 'giao',
     'password': "123456",
     'description': '会叫'
 }
# 创建序列化器对象   命名参数传入data字典
people_serializer = PeopleInfoSerializer(data=data)
# is_valid()方法校验字典参数是否正确  正确返回True  否则返回False
# raise_exception=True命名参数为错误的话抛出异常  不加的话只能用返回的对象.errors才能看到哪里出错误
people_serializer.is_valid(raise_exception=True)

反序列化时的验证

字段类型
在这里插入图片描述

字段选项

通用参数:

参数名称说明
read_only表明该字段仅用于序列化输出,默认为False
write_only表明该字段仅用于反序列化输入,默认为False
required表明该字段在反序列化时必须输入,默认为False
default反序列化时使用的默认值
label用于HTML展示API页面时,显示的字段名称
allow_null表明该字段是否允许传入None,默认为False

选项参数

参数名称作用
max_length最大长度
min_length最小长度
allow_blank是否允许为空
max_value最大值
min_value最小值

read_only和write_only不允许同时出现

反序列化之后的保存

  1. 序列化器中创建create方法
  2. save()保存到数据库,create方法必须实现
class BookInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='ID')
    name = serializers.CharField(label='书名')
    pub_date = serializers.DateField(label='发布日期')
    readcount = serializers.IntegerField(label='阅读量')
    commentcount = serializers.IntegerField(label='评论量')

    # people = PeopleInfoSerializer(many=True)
    def create(self, validated_data):
        """新建"""
        # BookInfo.objects.create(name="鹿鼎记",readcount=5)
        #  把 validated_data拆包传入
        return BookInfo.objects.create(**validated_data)

保存方式 save()方法

data = {
	 'id': 8,
    'name': "鹿鼎记",
    'pub_date': '2020-05-06',
    'readcount': 5,
    'commentcount': 200
}

# 创建序列化器对象 把字典传入进去
bookSerializer = BookInfoSerializer(data=data)

# 3验证
bookSerializer.is_valid(raise_exception=True)
# 保存
book = bookSerializer.sava()

修改数据

必须重写update()方法

class BookInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(label='ID')
    name = serializers.CharField(label='书名')
    pub_date = serializers.DateField(label='发布日期')
    readcount = serializers.IntegerField(label='阅读量')
    commentcount = serializers.IntegerField(label='评论量')

	# validated_data 为修改的字典  instance为模型类的对象
    def update(self, instance, validated_data):
        """更新,instance为要更新的对象实例"""
        instance.name = validated_data.get('name', instance.name)
        instance.pub_date = validated_data.get('pub_date', instance.pub_date)
        instance.readcount = validated_data.get('readcount', instance.readcount)
        instance.commentcount = validated_data.get('commentcount', instance.commentcount)
        # 修改完数据 模型类保存
        instance.save()
        # 返回模型类对象
        return instance

运行代码:
调用反序列化对象的update(要修改的模型类对象,反序列化字典数据)

from book.models import BookInfo
from book.serializers import BookInfoSerializer
# 获取到模型类对象
book = BookInfo.objects.get(id=1)
# 反序列化字典
data = {
    'id': 8,
    'name': '鹿鼎记2',
    'pub_date': "2020-05-06",
    'readcount': 5,
    'commentcount': 200
}
# 获取反序列化对象
book_serializer = BookInfoSerializer(data=data)
# 检验反序列化字典
book_serializer.is_valid(raise_exception=True)
# 调用反序列化对象的update(要修改的模型类对象,反序列化字典数据)方法
book_serializer.update(book,data)

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值