DRF框架之ModelSerializer序列化器
ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。
ModelSerializer与常规的Serializer相同,但提供了:
- 基于模型类自动生成一系列字段
- 基于模型类自动为Serializer生成validators,比如unique_together
- 包含默认的create()和update()的实现
在使用ModelSerializer序列化器时,我们只需要定义好序列化器类,并指定好对应的模型类和字段即可。
例如:
# 定义ModelSerializers序列化器
class BookInfoModelSerializer(serializers.ModelSerializer):
'''定义图书信息的ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
# model = 模型类名
model = BookInfo # 指定序列化和反序列化操作的字段
fields = '__all__' # __all__表示所有字段进行序列化
Shell测试代码:
>>> from booktest.serializers import BookInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
通过,测试代码,我们可以发现,ModelSerializer序列化器自动帮我们定义好了字段信息及约束信息。
体验过,ModelSerializer序列化器的简便性后,我们便开始正式的学习了。
注意:
fields='__all__':不包含外键字段,外键字段是特殊字段,必须自己定义才能实现序列化。
1. 创建ModelSerializer序列化器类
1.1 对模型类中所有字段都进行序列化和反序列化操作。
我们通过设置Meta类中的fields属性的值可以指定序列化器能够操作的字段数据。
当fields='__all__'时,表示序列化器能够对模型类中的所有字段数据进行序列化与反序列化的操作。
# 定义ModelSerializers序列化器
class BookInfoModelSerializer(serializers.ModelSerializer):
'''定义图书信息的ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
# model = 模型类名
model = BookInfo # 对全部字段进行序列化和反序列化操作
fields = '__all__' # __all__表示所有字段进行序列化
shell测试代码:
我们可以通过Shell代码看到能够进行序列化和反序列化操作的字段,并且能够发现,ModelSerializer序列化器已经自动地为我们创建好了模型字段和约束条件。
>>> from booktest.serializers import BookInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
1.2 对模型类中特定的字段进行序列化和反序列化操作。
当fields = (‘字段1’,...)时,表示当前的序列化器只能对元组中的字段进行序列化与反序列化操作。
class BookInfoModelSerializer(serializers.ModelSerializer):
'''ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
model = BookInfo # 对指定字段进行序列化和反序列化操作
fields = ('bread','btitle','bcomment')
Shell测试代码:
>>> from booktest.serializers import BookInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
btitle = CharField(label='名称', max_length=20)
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
1.3 指定模型类中不能被序列化和反序列化的字段。
在Meta类中,我们也可以通过指定exclude属性的值,来设置不能够被当前序列化器进行序列化与反序列化的字段数据。
class BookInfoModelSerializer(serializers.ModelSerializer):
'''ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
model = BookInfo # 指定不进行序列化和反序列化操作的字段
exclude = ('id', )
Shell测试代码:
>>> from booktest.serializers import BookInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
我们可以发现,通过exclude属性指定的字段,并没有被创建出来,也就是说明无法被序列化器进行操作。
1.4 指定关联字段
因为ModelSerializer序列化器时Serializer的子类,所以Serializer序列化能够进行的事ModelSerializer序列化器也能够进行。
在ModelSerializer序列化器中,我们也需要追加关联字段来实现关联序列化操作,并且关联方式与Serializer序列化器一致。
这里,我就只举一个多对一关联的例子,大家了解即可。
class HeroInfoModelSerializer(serializers.ModelSerializer):
'''定义查询Hero信息的ModeleSerializer序列化器''' # 添加关联字段(多对一)
hbook = BookInfoModelSerializer() class Meta:
# 指定模型类
model = HeroInfo
# 指定字段
fields = ('id', 'hname', 'hbook')
Shell测试代码:
>>> from booktest.serializers import HeroInfoModelSerializer
>>> s = HeroInfoModelSerializer()
>>> s
HeroInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
hname = CharField(label='名称', max_length=20)
hbook = BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
1.5 指定只读字段
在ModelSerializer序列化器中,我们可以通过在Meta类中,指定read_only_fields属性的值来设置只读字段。
class BookInfoModelSerializer(serializers.ModelSerializer):
'''定义图书信息的ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
# model = 模型类名
model = BookInfo # 对全部字段进行序列化和反序列化操作
fields = '__all__' # __all__表示所有字段进行序列化 # 定义只读字段
read_only_fields = ('id',)
Shell测试代码:
>>> from booktest.serializers import BookInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
通过测试代码,我们可以发现id字段被设置上了read_only属性。
1.6 为指定字段添加验证参数
在ModelSerializer序列化器中,我们可以通过在Meta类中,指定extra_kwargs属性的值来为指定的字段添加验证参数。
这里,我们需要注意的时extra_kwargs属性的值个格式是个字典。
extra_kwargs = {
'字段名':{
'验证选项':'验证条件',
}
}
案例代码:
class BookInfoModelSerializer(serializers.ModelSerializer):
'''定义图书信息的ModelSerializers序列化器''' class Meta:
# 指定序列化器对应的模型类
# model = 模型类名
model = BookInfo # 对全部字段进行序列化和反序列化操作
fields = '__all__' # __all__表示所有字段进行序列化 # 添加字段验证选项
extra_kwargs = {
'bcomment':{
'min_value':0,
'max_value':99999
}
}
Shell测试代码:
>>> from booktest.serializers import BookInfoModelSerializer, HeroInfoModelSerializer
>>> s = BookInfoModelSerializer()
>>> s
BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=99999, min_value=0, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
通过测试代码,我们可以发现bcomment字段被设置了两个新的验证条件。
2. ModelSerializer序列化器的其他操作
在本文的开始,我就提到ModelSerializer是Serializer的子类,所以,ModelSerializer也可以进行验证的扩展操作。
这里呢,我就不进行赘述了,其方式和Serializer序列化器是一致的,只需要在序列化器类中验证方法重写方法即可。
这里放上Serializer序列化器的文章,大家可以参考Serializer序列化器的验证来为ModelSerializer序列化器进行自定义验证。
Serializer序列化器:https://www.cnblogs.com/chao666/p/12269977.html
DRF框架之ModelSerializer序列化器的更多相关文章
- 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用
写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...
- DRF框架之Serializer序列化器的序列化操作
在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤 ...
- DRF框架之Serializer序列化器的反序列化操作
昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...
- DRF框架之 serializers 序列化组件
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...
- ModelSerializer序列化器实战
目录 ModelSerializer序列化器实战 单表操作 序列化器类 视图类 路由 模型 多表操作 models.py serializer.py views.py urls.py ModelSer ...
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
- 【DRF框架】利用序列化组件操作
使用序列化组件进行操作 不带参数:查+增 带参数:查.改.删 不带参数的操作 # url路由 url(r'^book_list/$',Search_book.as_view()), # views.p ...
- drf框架总结复习(1)
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成j ...
- 0008 基于DRF框架开发(01 DRF开发的基本流程)
1 创建模型 由于之前在<004 工程配置>中,已在Applications/Organizations/models中创建了一个UserInfo模型.此处引用这个模型. from dja ...
随机推荐
- weex框架
weex优势: (1)支持ES6规范 (2)性能优异,开发简介标准,提及小巧. (3)跨平台 weex调试工具:weexplayground weex环境搭建: (1)安装 node.js.npm ( ...
- POJ 3461:Oulipo
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28155 Accepted: 11251 Descript ...
- python scipy库
三.假定正态分布,求解1倍标准差和0.5倍标准差的概率? 二.求解多元线性或非线性方程组解 一.求解3元一次方程 1.学习资料 https://github.com/lijin-THU/notes- ...
- 关于SI4432的问题简单讲解
对于SX1278 和SI4432的对比性,下面为大家展示对比参数: 由此可以看出的SI4432虽然跟SX1278有部分地方不同,但是整体来说还是差别不大,各有各的长处和短处,性价比上个人还是觉得SI4 ...
- CSS - input 美化
input{ padding: 20px; width: 100%; height: 5vh; margin-bottom: 2vh; border-radius: 10vw; border: 0; ...
- grep -q
grep -q用于if逻辑判断 安静模式,不打印任何标准输出.如果有匹配的内容则立即返回状态值0. grep -q的用法 # if grep -q hello a.txt ; then ...
- 对OpenSSL心脏出血漏洞的试验
1.安装OpenSSL环境 sudo apt-get install openssl sudo pip install pyopenssl(中间会提示ffi.h 没有那个文件或目录,sudo apt- ...
- 当DIV内出现滚动条,fixed实效怎么办?
sticky 盒位置根据正常流计算(这称为正常流动中的位置),然后相对于该元素在流中的 flow root(BFC)和 containing block(最近的块级祖先元素)定位.在所有情况下( ...
- jQuery中的一些方法 19.5.20课上笔记
after() insertAfter():特定元素后面插入新的节点 before() insertBefore():特定元素前面插入新的节点 append() appendTo():向特定元素元素内 ...
- 关于fdisk命令
fdisk命令用于观察硬盘实体使用情况,也可对硬盘分区. [root@loclhost ~]# fdisk /dev/sdb Command (m for help): m #输入m列出常用的命令 C ...