1,序列化器概述
2,DRF的使用
-
Django restful framework: 开发符合restful风格的接口
- 1, 使用其提供的序列化器(数据转换和校验)
- 2, 视图的功能(业务的处理)
- 3,路径的处理
-
使用DRF体验restful开发的便捷
-
使用流程:
-
1,需要安装drf扩展
- pip install djangorestframework
-
2,将rest_framework需要注册到INSTALLED_APPS中
-
3,序列化器定义
-
作用:
- 1, 将前端的JSON(dict), 转成后端的模型 反序列化
2, 对前端提交过来的数据必须校验(我们不相信前端的任何数据)
3, 将后端的模型, 转换成前端的JSON 序列化
- 1, 将前端的JSON(dict), 转成后端的模型 反序列化
-
定义格式:
-
1, 创建类,继承自Serializer类(在子应用中定义serializers.py定义)
2, 编写字段,序列化器和模型类中的名字一样
3, 编写字段类型,也需要和模型类中的一样
4, 编写参数选项
label: 暂时理解成字段的注释
read_only: 只读 -
具体的代码:
#1,定义书籍的序列化器 class BookInfoSerializer(serializers.Serializer): id = serializers.IntegerField(label="书籍id",read_only=True) btitle = serializers.CharField(label="书籍名",max_length=20) bpub_date = serializers.DateField(label="发布日期") bread = serializers.IntegerField(label="阅读量") bcomment = serializers.IntegerField(label="评论量")
4,序列化器基本使用
-
作用: 序列化了单个对象数据
扫描二维码关注公众号,回复: 17354020 查看本文章 -
代码:
from booktest.models import BookInfo from booktest.serializers import BookInfoSerializer #1,查询数据 book = BookInfo.objects.get(id=1) #2,定义序列化器对象 #instance: 表示需要序列化的对象 serializer = BookInfoSerializer(instance=book) #3,输出 serializer.data
5,序列化器列表数据
-
作用: 将列表中的所有,对象数据, 转成JSON(字典)数据
-
代码
from booktest.models import BookInfo from booktest.serializers import BookInfoSerializer #1,查询数据 book = BookInfo.objects.all() #2,定义序列化器对象 #instance: 表示需要序列化的对象 #many: 告诉序列化器传入的是一个列表 serializer = BookInfoSerializer(instance=book,many=True) #3,输出 serializer.data
6,英雄序列化器关联外键
-
作用: 在输出英雄序列化数据的时候显示关联的外键内容
#一,关联外键 #read_only=`True`.表示在序列化的时候只能读取,不能修改 #`queryset`: 给字段加上一个查询集,在进行序列化的时候会读取里面的具体数据 # 或者,hbook = serializers.PrimaryKeyRelatedField(read_only=True) # hbook = serializers.PrimaryKeyRelatedField(queryset=BookInfo.objects.all()) #二,关联名字,实际上调用的是Bookinfo模型类中的__str__方法 hbook = serializers.StringRelatedField() #三,关联对象的序列化器 hbook = BookInfoSerializer()
7,书籍序列化器关联属性many
-
作用: 在序列化书籍的时候, 输出英雄的内容
#many=True: 关联英雄的字段,因为书籍可以被多个英雄去关联所以需要设置 #read_only=`True`.表示在序列化的时候只能读取,不能修改 heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)
9,反序列化,数据类型验证
-
作用: 对传入的数据类型校验
1, 使用序列化器字段校验 比如: IntegerField, 校验这个数是否是整数 CharField, 是否是字符串 DateField, 需要是日期格式 注意点: 整数和字符串可以相互转换,但是不能随意写
10,反序列化,选项验证
-
作用: 验证选项的值是否符合需求,比如: 长度是多少,比如是否一定要传递等
2, 字段的参数选项校验 read_only, 只读, 在序列化中有效 required, 默认就是True,是否必须需要传递, CharField: max_length , min_length 校验数据的范围 IntegerField: max_value, min_value, 校验数据的范围
11,反序列化,单个字段验证
-
作用: 验证单个字段的合法性
3, 单个字段的校验 格式: def validate_字段名字(self,value): return value 解释: 校验通过必须返回, 校验不通过抛出异常 #单独对btitle进行校验 def validate_btitle(self,value): """ value:传入的就是需要校验的btitle """ #1,校验数据 if not "django" in value: raise serializers.ValidationError("btitle must container django") #2,校验成功需要返回 return value
12,反序列化,多个字段validate验证
-
作用: 校验多个字段之间的关系
4,多个字段校验 格式:attrs,传入过来的字典数据 def validate(self,attrs): return attrs 解释: 校验通过必须返回, 校验不通过抛出异常 #多个字段校验 def validate(self, attrs): """ attrs就是传递过来的book_dict数据 book_dict = { "btitle":"python django", "bpub_date":"2000-1-1", "bread":10 "bcomment":3 } """ if attrs.get("bcomment") > attrs.get("bread"): raise serializers.ValidationError("评论量不能大于阅读量") return attrs
13,反序列化,自定义验证方法(理解)
#定义校验方法(自定义方法校验)
def check_bpub_date(value):
if value.year < 2019:
raise serializers.ValidationError("添加的书籍必须是2019年之后")
return value
bpub_date = serializers.DateField(label="发布日期",required=True,validators=[check_bpub_date])
14,反序列化,create保存数据
-
作用: 将反序列化,校验成功之后的数据,保存到数据库中
#实现create方法 def create(self, validated_data): """ validated_data:就是校验成功之后的数据data data = { "btitle": "django 基础", "bpub_date": "2019-1-1", "bread": 2, "bcomment": 1 } """ #1.创建book对象 # book = BookInfo.objects.create( # btitle=validated_data.get("btitle"), # bpub_date=validated_data.get("bpub_date"), # bread=validated_data.get("bread"), # bcomment=validated_data.get("bcomment"), # ) book = BookInfo.objects.create(**validated_data) #2.创建成功之后返回book对象 return book
15,反序列化,update更新数据
-
作用: 将反序列化,校验成功之后的数据,更新到数据库中
def update(self, instance, validated_data): """ instance:表示需要更新的对象,就是传进来的,book validated_data:校验成功之后的数据,就是data data = { "btitle": "django 高级", "bpub_date": "2019-1-1", "bread": 2, "bcomment": 1 } """ #1,更新数据 instance.btitle = validated_data.get("btitle",instance.btitle) instance.bpub_date = validated_data.get("bpub_date",instance.bpub_date) instance.bread = validated_data.get("bread",instance.bread) instance.bcomment = validated_data.get("bcomment",instance.bcomment) instance.save() return instance
16,ModelSerializer序列化器
-
作用: 快速生成序列化器字段,create,update方法
#定义书籍的,模型类序列化器 class BookInfoModelSerializer2(serializers.ModelSerializer): class Meta: #1,参考BookInfo,生成序列化器的字段 model = BookInfo #2,指定生成字段 fields = "__all__" #生成所有 # fields = ["id","btitle","bpub_date","bread","bcomment"] #生成指定 # exclude = ("id","is_delete","bimage") #不要哪些字段 #3,修改参数选项 # extra_kwargs = { # "bread":{"max_value":100,"min_value":0}, # "bcomment":{"required":True} # } #4,指定哪些字段,只读(序列化) # read_only_fields = ["bimage","is_delete"]