2020-11-05

drf—— 序列化组件

一、序列化组件介绍

#作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串  -Book模型--序列化器--->字典--通过drf:Response--》json格式字符串--->传给前端 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型  json格式数据---通过drf:Request-->字典---序列化器---》Book模型 3. 反序列化,完成数据校验功能

二、序列化组件简单使用

# 序列化的使用 -写一个序列化类继承serializers.Serializer -在类中写要序列化的字段 -在视图类中,实例化得到一个序列化类的对象,把要序列化的数据传入  ser=BookSerializer(instance=res,many=True) -得到字典  ser.data就是序列化后的字典

三、序列化组件使用代码实现

'''
5个接口1. 查询所有 Book--》get2. 查询单个 BookDetali--》get3. 新增一个 Book--》post4. 删除一个 BookDetali--》delete5. 修改一个 BookDetali--》put'''

1.查询所有

url:127.0.0.1.8000/books/ # 注意最后面的 /一定要写

 

 models.py  # 建立好模型,进行数据迁移,在数据库中手动添加至少2条数据

from django.db import modelsclass Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32,null=True) #测试read_only price = models.DecimalField(max_digits=5, decimal_places=2) publish = models.CharField(max_length=32)

urls.py   #配置好路由

path('books/', views.Book.as_view()),

views.py  #写视图类

from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom app01 import modelsfrom app01.serializer import BookSerializerclass Book(APIView): def get(self, request, *args, **kwargs):  res = models.Book.objects.all()  # 借助序列化器  # 如果是多条,就是many=True  # 如果是单个对象,就不写  ser = BookSerializer(instance=res, many=True)  print(type(ser)) # rest_framework.serializers.ListSerializer  # 通过序列化器得到的字典  # ser.data  print(ser.data)  return Response(ser.data)

serializer.py  #在app中创建存放序列化器的 类的文件 serializer.py 并写BookSerializer类

# 序列化器类(序列化Book表)# from rest_framework.serializers import Serializerfrom rest_framework import serializersfrom rest_framework.exceptions import ValidationErrorfrom app01 import modelsclass BookSerializer(serializers.Serializer): # 要序列化哪个字段 id = serializers.IntegerField(required=False) # id=serializers.CharField() title = serializers.CharField(max_length=32,min_length=2,read_only=True) price = serializers.DecimalField(max_digits=5, decimal_places=2) # 序列化的时候看不到,因为write_only=True
   publish = serializers.CharField(max_length=32,write_only=True)

2.查询单个

url:127.0.0.1.8000/books/1 #后面的数字代表查询id为几的数据 

urls.py中加

re_path('^books/(?P<id>\d+)', views.BookDetail.as_view()),

views.py中加

class BookDetail(APIView): def get(self, request, id):  res = models.Book.objects.all().filter(id=id).first()  # 单个,去掉many=True  # 加many=True和不加,ser不是同一个对象,查单个是BookSerializer对象,查多个是ListSerializer对象,这是由源码中元类决定的  ser = BookSerializer(instance=res)  print(type(ser)) # 打印出 app01.serializer.BookSerializer  return Response(ser.data)

3.新增一个  ---这里涉及到保存!!!

urls.py 不变

views.py

class Book(APIView): def get(self, request, *args, **kwargs):  ... def post(self, request):  # post提交的数据都在request.data 是个字典  print(request.data)  ser = BookSerializer(data=request.data)  if ser.is_valid(): # 校验数据是否合法   ser.save() # 保存到数据库中   return Response(ser.data)  else:   # 没有校验通过的错误信息   return Response(ser.errors)
serializer.py
# 如果序列化类继承的是Serializer,必须重写create方法class BookSerializer(serializers.Serializer): ... def create(self, validated_data):  # 为什么要重写create?为了跟views.py里面的Book表建立关系  res=models.Book.objects.create(**validated_data)  print(res)  return res

四、序列化类字段类型和字段参数

# 常用字段类型 -IntegerField -CharField -DecimalField -DateTimeField -。。。跟models中大差不差 # 常用字段参数 -选项参数  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 包含错误编号与错误信息的字典

五、序列化器的保存功能

同三中3.增加一个 里面的保存

六、序列化器的字段校验功能

 validators校验,局部钩子,全局钩子

# 三种方式 -字段自己的校验规则(max_length...) -validators的校验  publish = serializers.CharField(max_length=32,validators=[check,])  def check(data):  if len(data)>10:   raise ValidationError('最长不能超过10')  else:   return data -局部和全局钩子  # 局部钩子,validate_字段名,需要带一个data,data就是该字段的数据 def validate_title(self, data):  if data.startswith('sb'):   raise ValidationError('不能以sb开头')  else:   return data # 全局钩子 def validate(self, attrs):  title=attrs.get('title')  publish=attrs.get('publish')  if title==publish:   raise ValidationError('书名不能跟出版社同名')  else:   return attrs

七、序列化类常用字段参数之read_only和write_only

 read_only 表明该字段仅用于序列化输出,默认False write_only 表明该字段仅用于反序列化输入,默认False   class BookSerializer(serializers.Serializer):  # 要序列化哪个字段  id = serializers.IntegerField(required=False)  # id=serializers.CharField()  title = serializers.CharField(max_length=32,min_length=2,read_only=True)  price = serializers.DecimalField(max_digits=5, decimal_places=2)  # 序列化的时候看不到  publish = serializers.CharField(max_length=32,validators=[check,],write_only=True)

 

原文转载:http://www.shaoqun.com/a/488117.html

prezi:https://www.ikjzd.com/w/1751

环球b2b:https://www.ikjzd.com/w/1762

薇美铺:https://www.ikjzd.com/w/2312


一、序列化组件介绍#作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串-Book模型--序列化器--->字典--通过drf:Response--》json格式字符串--->传给前端2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型json格式数据---通过drf:Request-->字典---
skyee:https://www.ikjzd.com/w/290
米谷:https://www.ikjzd.com/w/1788
亚马逊如何合理经营成人用品?教你把成人用品加入审核白名单:https://www.ikjzd.com/home/116418
丽江纳西族女人的天下_男人的天堂 :http://tour.shaoqun.com/a/51847.html
(精品分析)亚马逊英国站宠物止吠器类目市场调查数据报告:https://www.ikjzd.com/home/19583

No comments:

Post a Comment