django--drf-序列化与反序列化
1、序列化(将模型转换成json数据)
序列化器
class BookInfoSerializer(serializers.Serializer):
'''书籍序列化器'''
id = serializers.IntegerField(label='ID',read_only=True)
btitle = serializers.CharField(max_length=20, label='名称',required=True)
bpub_date = serializers.DateField(label='发布日期')
bread = serializers.IntegerField( label='阅读量',required=False)
bcomment = serializers.IntegerField(label='评论量',required=False)
is_delete = serializers.BooleanField( label='逻辑删除',required=False)
序列化器的字段可多可少,不一定要与model中一致
label设置的是drf下面字段显示的名称
read_only =True
write_only = True
只做序列化的输出,模型转字典的动作,默认是false双向的可输出可出入
required=True(默认是True)
表示序列化的时候前端必须传数值
调用BookInfoSerializer(instance=None,data=empty)
向instance传入数据类型可为模型、查询集、字典,用作序列化返回给前端
向data传入的是将要被反序列化的,用作反序列化
serializer=BookInfoSerializer(instance=book)
serializer.data#获取序列化后的数据
serializer=BookInfoSerializer(instance=books,many=True)
如果里面放的是查询集,需要添加many=True,并且这里多个数据集返回的是列表(JsonResponse需要输入safe=True),多数据列表内容如下,OrderedDict
serializers.PrimaryKeyRelatedField #返回的是关联表的id
serializers.StringRelatedField #返回的是模型中__str__方法返回的值
在序列化器中调用另外一个序列化器,则会将另外一个表的相关内容全部返回,返回的是一个OrderedDict
2、反序列化(前端数据转化成为模型对象)
反序列化流程 == 前端发送的数据—>经过验证—>python字典—>save—>模型类对象(⽤于输⼊,接受前端数据)
serializer.is_valid()⽅法 在获取反序列化的数据前,必须调⽤is_valid()⽅法进⾏验证,验证成功返回True,否则返回False
serializer.is_valid(raise_exception=True) 校验错误后自动写出异常
serializer.errors属性 验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。
序列化器中对单个or多个联合字段添加校验规则
1) validate
class BookInfoSerializer(serializers.Serializer):
'''书籍序列化器'''
id = serializers.IntegerField(label='ID',read_only=True)
btitle = serializers.CharField(max_length=20, label='名称',required=True)
bpub_date = serializers.DateField(label='发布日期')
bread = serializers.IntegerField( label='阅读量',required=False)
bcomment = serializers.IntegerField(label='评论量',required=False)
is_delete = serializers.BooleanField( label='逻辑删除',required=False)
#添加校验 类似form的钩子函数 命名一定要为validate_字段名
def validate_btitle(self, value):
'''对序列化器中单个字段做校验'''
if 'django' not in value.lower():
raise serializers.ValidationError('图书不是关于django的')
return value
def validate(self, attrs):
'''
:param attrs: 指的全部字段,方便进行联合校验
:return: 必须返回传进来的数据 指的就是attrs
可以添加非传导过来的字段attrs['sgz']=666
大部分情况下使用validate比较多
'''
bread =attrs['bread']
bcomment= attrs['bcomment']
if bread<bcomment:
raise serializers.ValidationError['阅读量小于评论量']
return attrs
serializer.validated_data属性 验证成功,可以通过序列化器对象的validated_data属性获取数据。
调用serializers.save()会执行create和update方法在serializers.Serializer方法中已经写好了create和update方法,但是没有实际执行的操作,需要自己重写create和update方法
serializers.Serializer用法
class BookInfoSerialize(serializers.Serializer):
class Meta:
password1=serializers.CharField()#这个会加到校验那个里面去
model = BookInfo
# fields ='__all__'
# fields = ['id','btitle','bpubdate']
exclue = ['image']#不要某个字段
# extra_kwargs={
# 'bread':{'min_value':0,'required':True},
# 'bcomment':{'min_value':0,'write_only':True}
# }
read_only_fields = ['bread']#指定哪些字段之作序列化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示