序列化组件
目录
序列化组件
序列化组件介绍
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__
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Vue3封装支持Base64导出的电子签名组件
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)