Serializer序列化器

  • 前言
  • 序列化器作用
  • 定义Serializer
    • 定义方法
    • 字段与选项
    • 创建Serializer对象
  • 序列化使用
    • 基本使用
    • 增加额外字段
    • 关联对象序列化
  • 反序列使用
  • 模型类序列化器ModelSerializer
    • 指定字段

前言

  • 本篇来学习Serializer序列化器知识

序列化器作用

  • 进行数据的校验
  • 对数据对象进行转换

定义Serializer

定义方法

  • 模型
# models.pyfrom django.db import models# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):# 创建字段,字段类型name = models.CharField(max_length=20, verbose_name='名称')  # verbose_name admin管理后台使用pub_date = models.DateField(verbose_name='发布日期', null=True)readcount = models.IntegerField(default=0, verbose_name='阅读量')commentcount = models.IntegerField(default=0, verbose_name='评论量')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'bookinfo'  # 指明数据库表名verbose_name = '图书'  # 在admin站点中显示的名称def __str__(self):"""定义每个数据对象的显示信息"""return self.name
  • 序列化器
# -*- coding: utf-8 -*-
# @Time    : 2022/9/24
# @Author  : 大海
# serializers.pyfrom rest_framework import serializers
from book.models import BookInfoclass BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""name = serializers.CharField(max_length=20, label='名称')  # label DRF接口页面展示使用pub_date = serializers.DateField(label='发布日期', required=True)readcount = serializers.IntegerField(required=False, label='阅读量')commentcount = serializers.IntegerField(required=False, label='评论量')is_delete = serializers.BooleanField(required=False, label='逻辑删除')

字段与选项

  • 常用字段类型
  • 选项参数
参数名称 作用
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页面时,显示的字段帮助提示信息

创建Serializer对象

Serializer的构造方法为:

Serializer(instance=None, data=empty, **kwarg)

说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = AccountSerializer(account, context={‘request’: request})
通过context参数附加的数据,可以通过Serializer对象的context属性获取。

序列化使用

基本使用

  • 进入Django shell模式
python manage.py shell
  1. 查询一个图书对象
from book.models import BookInfobook = BookInfo.objects.get(id=1)
  1. 构造序列化器
from book.serializers import BookInfoSerializerserializer = BookInfoSerializer(book)
  1. 获取序列化数据
serializer.data
  1. 如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books,many=True)
serializer.data


增加额外字段

# serializers.py
from rest_framework import serializersclass BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""name = serializers.CharField(max_length=20, label='名称')  # label DRF接口页面展示使用pub_date = serializers.DateField(label='发布日期', required=True)readcount = serializers.IntegerField(required=False, label='阅读量')commentcount = serializers.IntegerField(required=False, label='评论量')is_delete = serializers.BooleanField(required=False, label='逻辑删除')hello = serializers.CharField()  # 增加模型中不存在字段
  • 进入Django shell模式
python manage.py shell
from book.models import BookInfobook = BookInfo.objects.get(id=1)book.hello = '666'from book.serializers import BookInfoSerializerserializer = BookInfoSerializer(book)serializer.data

关联对象序列化

  • models.py
from django.db import models# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):# 创建字段,字段类型name = models.CharField(max_length=20, verbose_name='名称')  # verbose_name admin管理后台使用pub_date = models.DateField(verbose_name='发布日期', null=True)readcount = models.IntegerField(default=0, verbose_name='阅读量')commentcount = models.IntegerField(default=0, verbose_name='评论量')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')class Meta:db_table = 'bookinfo'  # 指明数据库表名verbose_name = '图书'  # 在admin站点中显示的名称def __str__(self):"""定义每个数据对象的显示信息"""return self.name# 准备人物列表信息的模型类
class PeopleInfo(models.Model):# 定义一个有序字典GENDER_CHOICES = ((0, 'male'),(1, 'female'))name = models.CharField(max_length=20, verbose_name='名称')gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')description = models.CharField(max_length=200, null=True, verbose_name='描述信息')is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')# 外键 ForeignKey# 系统会字典为外加添加  id# 外键的级联操作  1对多 (书籍对人物)# CASCADE:删除主表数据时连通一起删除外键表中数据book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')class Meta:db_table = 'peopleinfo'verbose_name = '人物信息'
  • serializers.py
# -*- coding: utf-8 -*-
# @Time    : 2022/9/24
# @Author  : 大海
from abc import ABCfrom rest_framework import serializers
from book.models import BookInfoclass BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""name = serializers.CharField(max_length=20, label='名称')  # label DRF接口页面展示使用pub_date = serializers.DateField(label='发布日期', required=True)readcount = serializers.IntegerField(required=False, label='阅读量')commentcount = serializers.IntegerField(required=False, label='评论量')is_delete = serializers.BooleanField(required=False, label='逻辑删除')# hello = serializers.CharField()  # 增加模型中不存在字段class HeroInfoSerializer(serializers.Serializer):"""英雄数据序列化器"""GENDER_CHOICES = ((0, 'female'),(1, 'male'))id = serializers.IntegerField(label='ID', read_only=True)name = serializers.CharField(label='名字', max_length=20)gender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)description = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)is_delete = serializers.BooleanField(label='是否删除', required=False)# 默认序列化外键id# book = serializers.PrimaryKeyRelatedField(label='书籍', read_only=True)# 序列化关联模型的__str__方法返回值序列化# book = serializers.StringRelatedField(label='书籍', read_only=True)# 关联模型序列化器所有字段序列化book = BookInfoSerializer()# book = serializers.PrimaryKeyRelatedField(label='书籍', queryset=BookInfo.objects.all())
#  book = serializers.PrimaryKeyRelatedField(label='书籍', read_only=True) 默认序列化外键id
In [1]: from book.models import BookInfo,PeopleInfoIn [2]: from book.serializers import BookInfoSerializer,HeroInfoSerializerIn [3]: hero = PeopleInfo.objects.get(id=1)In [4]: serializer = HeroInfoSerializer(instance=hero)In [5]: serializer.data
Out[5]: {'id': 1, 'name': '郭靖', 'gender': 1, 'description': '降龙十八掌', 'is_delete': False, 'book': 1}# book = serializers.StringRelatedField(label='书籍', read_only=True) 序列化关联模型的__str__方法返回值序列化
In [1]: from book.serializers import BookInfoSerializer,HeroInfoSerializer...: ...: from book.models import BookInfo,PeopleInfo...: ...: hero = PeopleInfo.objects.get(id=1)...: ...: serializer = HeroInfoSerializer(instance=hero)In [2]: serializer.data
Out[2]: {'id': 1, 'name': '郭靖', 'gender': 1, 'description': '降龙十八掌', 'is_delete': False, 'book': '射雕英雄传'}# book = BookInfoSerializer()
In [1]: from book.serializers import BookInfoSerializer,HeroInfoSerializer...: ...: from book.models import BookInfo,PeopleInfo...: ...: hero = PeopleInfo.objects.get(id=1)...: ...: serializer = HeroInfoSerializer(instance=hero)In [2]: serializer.data 关联模型序列化器所有字段序列化
Out[2]: {'id': 1, 'name': '郭靖', 'gender': 1, 'description': '降龙十八掌', 'is_delete': False, 'book': OrderedDict([('nam
e', '射雕英雄传'), ('pub_date', '1980-05-01'), ('readcount', 12), ('commentcount', 34), ('is_delete', False)])}

反序列使用

  • 进入Django shell模式
: data = {...:     'name': '北漂纪实',...:     'pub_date':'2022-12-10'...: }In [2]: from book.serializers import BookInfoSerializerIn [3]: serializer = BookInfoSerializer(data=data)In [4]: serializer.is_valid(raise_exception=True)  # 调用序列化器校验方法
Out[4]: TrueIn [5]: serializer.errors   # 获取错误信息
Out[5]: {}In [6]: serializer.validated_data  # 获取反序列化后的数据
Out[6]: OrderedDict([('name', '北漂纪实'), ('pub_date', datetime.date(2022, 12, 10))])
  • 单个字段校验
class BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""name = serializers.CharField(max_length=20, label='名称')  # label DRF接口页面展示使用pub_date = serializers.DateField(label='发布日期', required=True)readcount = serializers.IntegerField(required=False, label='阅读量')commentcount = serializers.IntegerField(required=False, label='评论量')is_delete = serializers.BooleanField(required=False, label='逻辑删除')# hello = serializers.CharField()  # 增加模型中不存在字段peopleinfo_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)  # 序列化id# peopleinfo_set = HeroInfoSerializer(many=True)  # 一关联多 需要指定many=true 全部值def validate_name(self, value):"""序列化器中单个字段校验"""if 'django' not in value.lower():raise serializers.ValidationError("图书不是关于Django的")return value
  • shell 模式
 from book.serializers import BookInfoSerializerIn [2]: data = {...:     'name': '北漂纪实',...:     'pub_date':'2022-12-10'...: }In [3]: serializer = BookInfoSerializer(data=data)
serializer.is_valid(raise_exception=True)...: ...:
---------------------------------------------------------------------------
ValidationError                           Traceback (most recent call last)
<ipython-input-5-c24be91bdde3> in <module>
----> 1 serializer.is_valid(raise_exception=True)2D:\Python39\lib\site-packages\rest_framework\serializers.py in is_valid(self, raise_exception)233234         if self._errors and raise_exception:
--> 235             raise ValidationError(self.errors)236237         return not bool(self._errors)ValidationError: {'name': [ErrorDetail(string='图书不是关于Django的', code='invalid')]}
  • serializers.py
class BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""name = serializers.CharField(max_length=20, label='名称')  # label DRF接口页面展示使用pub_date = serializers.DateField(label='发布日期', required=True)readcount = serializers.IntegerField(required=False, label='阅读量')commentcount = serializers.IntegerField(required=False, label='评论量')is_delete = serializers.BooleanField(required=False, label='逻辑删除')# hello = serializers.CharField()  # 增加模型中不存在字段peopleinfo_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)  # 序列化id# peopleinfo_set = HeroInfoSerializer(many=True)  # 一关联多 需要指定many=true 全部值def validate_name(self, value):"""序列化器中单个字段校验validate_<field_name>"""if 'django' not in value.lower():raise serializers.ValidationError("图书不是关于Django的")return valuedef validate(self, attrs):"""多个字段校验attrs 传过来的数据 字典类型"""bread = attrs['readcount']bcomment = attrs['commentcount']if bread < bcomment:raise serializers.ValidationError('阅读量小于评论量')return attrsdef create(self, validated_data):"""新建"""return BookInfo.objects.create(**validated_data)def update(self, instance, validated_data):"""更新,instance为要更新的对象实例"""instance.name = validated_data.get('name', instance.name)instance.readcount = validated_data.get('readcount', instance.readcount)instance.commentcount = validated_data.get('commentcount', instance.commentcount)instance.save()return instance
  • 修改
from book.serializers import BookInfoSerializerIn [4]: from book.models import BookInfoIn [5]: book = BookInfo.objects.get(id=5)In [6]: data = {...:     'name': '北漂纪实007-django',...:     'pub_date':'2022-12-10',...:     'readcount': 20,...:     'commentcount':10...: }In [7]: serializer = BookInfoSerializer(book,data)In [8]: serializer.is_valid(raise_exception=True)
Out[8]: TrueIn [9]: serializer.save()
Out[9]: <BookInfo: 北漂纪实007-django>

模型类序列化器ModelSerializer

  • 模型序列化器
from rest_framework import serializers
from book.models import BookInfoclass BookInfoSerializer(serializers.ModelSerializer):"""图书数据序列化器"""class Meta:model = BookInfo  # 指定模型fields = '__all__'  # 指定序列化器包含所有字段

指定字段

  1. 使用fields来明确字段,__all__表名包含所有字段,也可以写明具体哪些字段,如
class BookInfoSerializer(serializers.ModelSerializer):"""图书数据序列化器"""class Meta:model = BookInfofields = ['id', 'name', 'bpub_date']
  1. 使用exclude可以明确排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):"""图书数据序列化器"""class Meta:model = BookInfoexclude = ['readcount']
  1. 指明只读字段
class BookInfoSerializer(serializers.ModelSerializer):"""图书数据序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')read_only_fields = ('id', 'readcount')
  1. 修改选项参数
lass BookInfoSerializer(serializers.ModelSerializer):"""图书数据序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')extra_kwargs = {'readcount': {'min_value': 0, 'required': True},'commentcount': {'min_value': 0, 'required': True},}

20-Django REST framework-Serializer序列化器相关推荐

  1. Andriod:serializer序列化器生成xml文件

    serializer序列化器生成xml文件 目录 serializer序列化器生成xml文件 一.目录结构 二.类MainActivity 三.类:SMS 四.activity_main.xml 一. ...

  2. 定义Serializer序列化器

    序列化器的作用: 进行数据的校验 对数据对象进行转换 定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_fra ...

  3. Serializer序列化器使用

    定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializ ...

  4. django 不包括字段 序列化器_手写一个Django序列化功能

    本文章的代码已上传至github上(github包含了更多功能,相关文章后续更新) AGL1994/django-building​github.com 前言 目前Django比较知名的序列化框架有D ...

  5. Django restful Framework 之序列化与反序列化

    1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下: IN ...

  6. django 不包括字段 序列化器_DRF比Django的认证和权限高在哪里

    ‍Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式.我们通过继续学习官网教程来进 ...

  7. Django restframework中 Serializer 序列化方法详细介绍

    以前在写django 的时候,从后端拿到数据返回给前端,每个字段都要单独进行定义,有了Serializer方法,我们可以节省代码量. 首先,编写今天的models 表,并自己进行url 配置,详细参照 ...

  8. 谈谈Django REST Framework(DRF)中的序列化器

    摘要 Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API.其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地 ...

  9. DRF (Django REST framework) 框架介绍(3)

    DRF中的Request 与 Response 1. Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST fra ...

  10. Django Rest Framework的使用整理

    Django Rest Framework 一.Rest Framework的基本介绍 程序的客户端有很多:硬件设备,游戏,APP,软件,其他的外部服务端. 1. Web应用模式 在开发Web应用中, ...

最新文章

  1. 微信小程序插件新增能力
  2. opencv imencode跟imdecode函数jpg(python)
  3. maven自动化部署插件sshexec-maven-plugin
  4. 基于AVS2的图片容器——TPG:现状与改进之路
  5. [linux] 查看网络丢包信息
  6. 【UVA - 227】Puzzle (模拟,水题)
  7. 开源GIS(十一)——openlayers中加载离线标准与自定义切片(深度好文)
  8. splice方法_Array中splice用法
  9. android调用邮件应用发送email
  10. 加密与解密 linux,security 02: 加密与解密 、 扫描与抓包 、 总结和答疑 、 SELinux安全防护(示例代码)...
  11. 关于APP接口设计 注意事项
  12. 用cmd命令行下载github中的工程文件
  13. Hive ANALYZE NOSCAN
  14. [1][python基础]条件判断[4]
  15. Freemaker判断是否为空
  16. FPGA可以转行数字IC验证吗?
  17. csp模拟题-炉石传说
  18. 程序员养生之道:Google 是如何鼓励员工多吃蔬菜的?
  19. 微信聊天记录丢失后的记录
  20. 深圳市住房公积金提取办法

热门文章

  1. 苹果x处理器多少_精仿苹果iPhone XR手机配置介绍
  2. 软件架构设计(一)——软件架构风格
  3. 什么是华为云服务器?它有什么优点?
  4. html标签的下一级遍历,jquery属性,遍历,HTML操作方法详解
  5. 最新『资源分享』IT视频教程
  6. Cmn递推函数c语言,Cmn排列组合 高三数学知识点总结归纳5篇精选
  7. 渣土车空车未盖盖识别系统 OpenCv
  8. git 小乌龟安装教程
  9. 小乌龟代码提交Gitee
  10. CISSP 第五章 物理和环境安全