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 ...
随机推荐
- LeetCode#3 - 无重复字符的最长字串(滑动窗口)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: abcabcbb 输出的结果应该是3,最长的无重复的字串是'abc' 果然无论做什么都要静下心来啊!昨晚上卡了一个多小 ...
- SQL inner join, join, left join, right join, full outer join
基本信息 创建两个表a1, a2. 两个表的重要差别是:a1 中有5,'wu',a2中没有. a2中有 4,'li',而a1中没有. 创建表和插入数据的代码如下: -- 创建a1表 create ta ...
- Integer和int的区别
1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...
- DRF项目之解决浏览器同源策略问题
DRF项目,是一个前后端分离的Web框架. 本项目中,我们前端采用的是VUE框架. 前后端分离的情况就会出现一个问题,前端的Ajax请求无法请求到后端API(接口). 那么,为什么会出现这种问题呢? ...
- 最短路问题--P4779 单源最短路(标准版)Dijkstra堆优化
题目背景 2018 年7月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 最终,他因此没能与理想的大学达成契约. 小 F 衷心祝愿大家不再重 ...
- linux 替换jdk指定jar包
我的bug是:jdk1.8的安全策略和腾讯邮箱服务有冲突.我知道的解决方法: 1更换低版本安全策略相关的jar包.(windows:http://www.cnblogs.com/dennyzhangd ...
- 二十三种设计模式 python实现
设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...
- Linux-socket编程接口介绍
1.建立连接 (1).socket.socket函数类似于open,用来打开一个网络连接,如果打开成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都可以通过这个网络文件描述符. ( ...
- [CF百场计划]#2 Codeforces Round #618 (Div. 2)
A. Non-zero Description: Guy-Manuel and Thomas have an array \(a\) of \(n\) integers [\(a_1, a_2, \d ...
- UITableViewCell 的selectedBackgroundView
UITableViewCell中的selectedBackgroundView就是用于当用户点击cell的时候,选择状态的view,你可以对这个view进行颜色或者其他样式等做一些定制,可以达到点击之 ...