序列化组件
目录
序列化组件
序列化组件介绍
1 序列化,序列化器会把模型类对象转换成字典,经过response变成json字符串
2 反序列化,把客户端发送过来的数据,经过request变成字典,序列化器可以把字典转成模型类对象
3 反序列化,完成数据校检功能
简单使用
1 写一个序列化类,继承Serializer
2 在类中写要序列化的字段
3 在视图中使用,导入序列化类,实例化得到序列化的对象,把序列化对象传入
4 序列化类的对象.data是一个字典
5 把字典返回,使用rest_framework的Response,或者JsonResponse
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
price = serializers.CharField()
author = serializers.CharField()
publish = serializers.CharField()
class BookAPIView(APIView):
def get(self,request):
book = Book.objects.all()
boo_ser = BookSerializer(Book)#实例化得到序列化对象,把序列化对象传入
return Response(boo_ser.data)#序列化类的对象.data是一个字典,用rest_framework的Response返回,或JsonResponse返回
序列化的字段类型
#常用的字段
CharField,必须参数max_length
IntegerField,
DateField,
DecimalField,参数ecimal_places=2#表示保留小数2位,max_digits=5#整数5位
BooleanField,#布尔类型
NullBooleanField,#可以为空的布尔类型
DateTimeField,参数auto_now_add=True##创建数据时自动把当前时间写入该字段auto_now=True#更新数据会更新该时间,只能同时存在一个
ImageField(upload_to='icon',default='media/icon/default.png')#保存路径icon,默认的头像位置media/icon/default.png
#字段参数
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值
#通用参数
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息
序列化组件完整使用
Serializers
###ser.py
#其他的校检方式,写一个函数,不要写在序列化类里,配置方式
# 在author=serializers.CharField(validators=[check_author])
def check_author(data):
if data.startawith('sb') or data.endswith('sb'):
raise ValidationError('author不能包含sb字符')
else:
return data
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
price = serializers.CharField()
author = serializers.CharField(validators=[check_author])
# 局部钩子,validate_需要校检的字段名
def validate_price(self, data):
print(type(data), data)
if float(data) <= 1:
raise ValidationError('价格太低了') # 报校检错误
else:
return float(data)
# 全局钩子,校检更多的字段
def validate(self, attrs, ):
author = attrs.get('author')
# price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
name = attrs.get('name')
if author.startswith('sb') or author.endswith('sb'):
raise ValidationError('author不能包含sb字符')
if name.startswith('sb') or name.endswith('sb'):
raise ValidationError('name不能包含sb字符')
else:
return attrs
ModelSerializer、extra_kwargs(额外的键值)
###ModelSerializer
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from app01.models import Book
# ModelSerializer比Serializers多了update、create方法
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = Book#序列化的模型类
fields = '__all__'#‘__all__’所有,也可以自己指定('name','price')
extra_kwargs = { # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
'id': {'read_only': True},
}
#局部钩子,validate_需要校检的字段名
def validate_price(self,data):
print(type(data),data)
if float(data) <= 1:
raise ValidationError('价格太低了')#报校检错误
else:
return float(data)
#全局钩子,校检更多的字段
def validate(self, attrs,):
author = attrs.get('author')
# price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
name = attrs.get('name')
if author.startswith('sb') or author.endswith('sb'):
raise ValidationError('author不能包含sb字符')
if name.startswith('sb') or name.endswith('sb'):
raise ValidationError('name不能包含sb字符')
else:
return attrs
###extra_kwargs(额外的键值)
class Meta:
model = Book
fields = '__all__'
extra_kwargs = { # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
'id': {'read_only': True},
}
read_only 表明该字段仅由于序列化输出
write_only 表明该字段仅由于反序列化输入
#了解
required 表明该字段在序列化时必须输入
default 反序列化时使用的默认值
allow_null 是否允许传入none,默认False
vilidators 该字段使用的验证器
error_messages 包含错误编码与错误信息的字典
many=True
#获取所有,序列化多条数据,使用many=True
books = Book.objects.all()
book_ser=BookModelSerializer(books,many=True)
source、SerializerMethodField()的使用
#source
1 可以改字段名字,改成aaa,前端获取的就是aaa而不是数据库中真是的字段名
aaa=serializers.CharField(source='name')
2 可以跨表
aaa=serializers.CharField(source='publish.name')
3 可以执行方法,test是模型类Book中的方法
aaa=serializers.CharField(source='test')
#SerializerMethodField(),它需要有个配套方法,get_字段名,返回值就是要那个字段的值
def get_author(self,instance):
authors = instance.authors.all()
list1=[]
for author in authors:
list.append({'name':author.name,'age':author.age})
return list1
自己封装Response对象
class MyResponse():
def __init__(self):
self.status = 100
self.msg = '成功'
@property
def get_dict(self):
return self.__dict__