反序列化
流程:
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
不允许同时出现
反序列化之后的保存
- 序列化器中创建create方法
- 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)
结果: