2 序列化组件介绍

1. 序列化,序列化器会把模型对象(queryset,单个对象)转换成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request.data以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能

3 序列化类的基本使用

# 1 创建book表模型
# 2 写查询所有图书的接口:APIVie+序列化类+Response
​

3.1 查询所有和查询单条

views.py

class BookView(APIView):def get(self, request):book_list = Book.objects.all()# 使用序列化类,完成序列化  两个很重要参数: instance实例,对象      data:数据# 如果是多条many=True  如果是queryset对象,就要写# 如果是单个对象 many=False,默认是Falseserializer = BookSerializer(instance=book_list, many=True)# serializer.data  # 把qs对象,转成列表套字典  ReturnList# print(serializer.data)# print(type(serializer.data))# return Response(serializer.data)return Response({'code': 100, 'msg': '成功', 'data': serializer.data})
​
​
class BookDetailView(APIView):def get(self, request, pk):book = Book.objects.all().get(pk=pk)serializer = BookSerializer(instance=book)return Response({'code': 100, 'msg': '成功', 'data': serializer.data})

urls.py

urlpatterns = [path('books/', views.BookView.as_view()),path('books/<int:pk>/', views.BookDetailView.as_view()),
]

序列化类

from rest_framework import serializers
​
class BookSerializer(serializers.Serializer):# 要序列化的字段# id = serializers.IntegerField()name = serializers.CharField()# price = serializers.IntegerField()

总结

# 序列化类的使用
1 写一个类,继承serializers.Serializer
2 在类中写字段,要序列化的字段
3 在视图类中使用:(多条,单条)serializer = BookSerializer(instance=book_list, many=True)serializer = BookSerializer(instance=book)

4 常用字段类和参数(了解)

4.1 常用字段类

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)
# IntegerField      CharField   DateTimeField  DecimalField
​
# ListField和DictField---》比较重要,但是后面以案例形式讲

4.2 字段参数(校验数据来用的)

选项参数:(CharField,IntegerField)

参数名称 作用
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
# read_only   write_only   很重要,后面以案例讲

5 反序列化之校验

# 反序列化,有三层校验-1 字段自己的(写的字段参数:required   max_length 。。。)-2 局部钩子:写在序列化类中的方法,方法名必须是 validate_字段名def validate_name(self, name):if 'sb' in name:# 不合法,抛异常raise ValidationError('书名中不能包含sb')else:return name-3 全局钩子:写在序列化类中的方法 方法名必须是 validatedef validate(self, attrs):price = attrs.get('price')name = attrs.get('name')if name == price:raise ValidationError('价格不能等于书名')else:return attrs# 只有三层都通过,在视图类中:ser.is_valid():  才是True,才能保存

6 反序列化之保存

# 新增接口:-序列化类的对象,实例化的时候:ser = BookSerializer(data=request.data)-数据校验过后----》调用  序列化类.save()--->但是要在序列化类中重写  create方法def create(self, validated_data):book=Book.objects.create(**validated_data)return book# 修改接口-序列化类的对象,实例化的时候:ser = BookSerializer(instance=book,data=request.data)-数据校验过后----》调用  序列化类.save()--->但是要在序列化类中重写  update方法def update(self, book, validated_data):for item in validated_data:  # {"name":"jinping","price":55}setattr(book, item, validated_data[item])book.save()return book# 研究了一个问题在视图类中,无论是保存还是修改,都是调用序列化类.save(),底层实现是根据instance做一个判断

7 5个接口代码

路由

urlpatterns = [path('books/', views.BookView.as_view()),path('books/<int:pk>/', views.BookDetailView.as_view()),
]

视图

from .models import Book
from .serializer import BookSerializer
​
​
class BookView(APIView):def get(self, request):book_list = Book.objects.all()# 使用序列化类,完成序列化  两个很重要参数: instance实例,对象      data:数据# 如果是多条many=True  如果是queryset对象,就要写# 如果是单个对象 many=False,默认是Falseserializer = BookSerializer(instance=book_list, many=True)# serializer.data  # 把qs对象,转成列表套字典  ReturnList# print(serializer.data)# print(type(serializer.data))# return Response(serializer.data)return Response({'code': 100, 'msg': '成功', 'data': serializer.data})
​# 新增def post(self, request):# 前端会传入数据,request.data--->把这个数据保存到数据库中# 借助于序列化类,完成 校验和反序列化# data 前端传入的数据 {"name":"三国演义","price":88}ser = BookSerializer(data=request.data)# 校验数据if ser.is_valid():  # 三层:字段自己的校验,局部钩子校验,全局钩子校验# 校验通过,保存print(ser.validated_data)  # validated_data:校验过后的数据# 如果没有save,如何保存,自己做# Book.objects.create(**ser.validated_data)ser.save()  # 会保存,但是会报错,因为它不知道你要保存到那个表中return Response({'code': 100, 'msg': '新增成功'})else:print(ser.errors)  # 校验失败的错误return Response({'code': 101, 'msg': '新增失败', 'errors': ser.errors})
​
​
class BookDetailView(APIView):def get(self, request, pk):book = Book.objects.all().get(pk=pk)serializer = BookSerializer(instance=book)return Response({'code': 100, 'msg': '成功', 'data': serializer.data})
​def put(self, request, pk):book = Book.objects.get(pk=pk)ser = BookSerializer(instance=book, data=request.data)if ser.is_valid():ser.save() # 也会报错,重写updatereturn Response({'code': 100, 'msg': '修改成功'})else:return Response({'code': 101, 'msg': '修改失败', 'errors': ser.errors})

序列化类

# from rest_framework.serializers import Serializer
from rest_framework import serializers
​
from rest_framework.exceptions import ValidationError
from .models import Book
​
​
class BookSerializer(serializers.Serializer):# 要序列化的字段id = serializers.IntegerField(required=False)  # 前端传入数据,可以不填这个字段name = serializers.CharField(allow_blank=True, required=False, max_length=8,min_length=3, error_messages={'max_length': '太长了'})  # allow_blank: 这个字段传了,value值可以为空price = serializers.IntegerField(max_value=100, min_value=10, error_messages={'max_value': '必须小于100'})
​# price = serializers.CharField()
​# 局部钩子:给某个字段做个校验# 书名中不能包含sb# validate_字段名def validate_name(self, name):if 'sb' in name:# 不合法,抛异常raise ValidationError('书名中不能包含sb')else:return name
​def validate_price(self, item):if item == 88:raise ValidationError('价格不能等于88')else:return item
​# 全局钩子# 价格和书名不能一样  validatedef validate(self, attrs):price = attrs.get('price')name = attrs.get('name')if name == price:raise ValidationError('价格不能等于书名')else:return attrs
​def create(self, validated_data):# validated_data校验过后的数据,字典book = Book.objects.create(**validated_data)return book
​# def update(self, book, validated_data):#     # instance 要修改的对象#     # validated_data:前端传入,并且校验过后的数据#     book.name = validated_data.get('name')#     book.price = validated_data.get('price')#     # 一定不要忘了#     book.save()#     return bookdef update(self, book, validated_data):
​for item in validated_data:  # {"name":"jinping","price":55}setattr(book, item, validated_data[item])# 等同于下面# setattr(book,'name','jinping')# setattr(book,'price',55)# 等同于#     book.name = validated_data.get('name')#     book.price = validated_data.get('price')book.save()return book

表模型

from django.db import models
​
​
# Create your models here.
​
class Book(models.Model):name = models.CharField(max_length=32)price = models.BigIntegerField()# 面试题:BigIntegerField跟IntegerField有什么区别

drf -------序列化组件相关推荐

  1. 1. DRF 序列化组件

    0. 环境创建 * 1. 新建一个项目 * 2. 修改 tempaltes路径问题 # 修改模板文件路径拼接问题 'DIRS': [BASE_DIR, 'templates'] * 3. 在app01 ...

  2. Django框架(十九)—— drf:序列化组件(serializer)

    序列化组件 # 模型层 from django.db import modelsclass Book(models.Model): nid = models.AutoField(primary_key ...

  3. DRF的序列化——Serializers 序列化组件

    为什么要用序列化组件 当我们做前后端分离的项目~~ 我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库 ...

  4. Django DRF认证组件/权限组件/序列化组件综合总结(完整版)

    本代码完成的功能是: 1.根据token判断用户登录状态,然后提示用户是否登陆, 2.用户登录后,根据用户类型判断用户是否有权限查看资料 使用rest_framework一定要在配置文件设置先设置 ' ...

  5. drf3 Serializers 序列化组件

    为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...

  6. APIView与序列化组件使用

    APIView基本使用 1.什么是APIView Django中视图views.py有两种一种是基于类的实现另一种是函数的实现,而APIView就是REST framework提供的所有视图的基类,继 ...

  7. Ajax 发送json格式数据以及发送文件(FormData)和自带的序列化组件: serializers

    前后端传输数据的编码格式(contentType) get请求数据就是直接放在url?后面的 url?usernmae=junjie&password=123... 可以向后端发送post请求 ...

  8. 快速上手Django(六) -Django之Django drf 序列化器Serializer类

    文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...

  9. Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer

    文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...

最新文章

  1. 微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
  2. 绝地求生信号枪只能在服务器吗,绝地求生信号枪怎么用?信号枪刷新点及用法详解...
  3. 郭卓惺:互动课堂的搭建实例及相关领域应用
  4. python 3.6.5 shell_linux安装python3.6.5
  5. ajax在php中使用方法,在项目中如何使用ajax请求
  6. python遇到天猫反爬虫_用Python爬取天猫评价-我的新游戏
  7. backup exec删除备份文件
  8. rtthread qspi w25q256
  9. RT-Thread学习笔记|74HC595驱动数码管详解
  10. Xshell安装教程-Xshell 6 个人版安装与远程操作连接服务器
  11. ADAS常见缩略词(FCW/LKA/LCA/LDW...)
  12. 【CAD二次开发】CAD插件没有权限修改C盘信息的解决方法
  13. restful接口实战 更新用put 新增用post 获取get 删除detele
  14. linux库文件编译的makefile
  15. 关于新版微信电脑版HOOK的技术经验(WX电脑版3.0)
  16. win7旗舰版系统下载
  17. 如何创建一个原始Mac OS镜像
  18. 【读报告】基于物联网技术的道岔转换设备检测专家平台的研究 研制报告
  19. 求矩阵中非零元素个数(L0范式)
  20. c语言一元多项式相加

热门文章

  1. 加了权重样本的AUC如何计算
  2. Understanding Diffusion Models
  3. 30岁测试大妈被大厂裁掉后(持续更新)面试准备2
  4. JQuery之动画与特效
  5. php js漂浮,js 居中漂浮广告
  6. unity转抖音小游戏笔记
  7. C++11移动构造函数详解
  8. E. Gardener and Tree
  9. netcat使用教程
  10. WordPress子比主题【夜/日】间模式切换小提示[WP教程]