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序列化器的更多相关文章

  1. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  2. DRF框架之Serializer序列化器的序列化操作

    在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤 ...

  3. DRF框架之Serializer序列化器的反序列化操作

    昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...

  4. DRF框架之 serializers 序列化组件

    1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...

  5. ModelSerializer序列化器实战

    目录 ModelSerializer序列化器实战 单表操作 序列化器类 视图类 路由 模型 多表操作 models.py serializer.py views.py urls.py ModelSer ...

  6. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  7. 【DRF框架】利用序列化组件操作

    使用序列化组件进行操作 不带参数:查+增 带参数:查.改.删 不带参数的操作 # url路由 url(r'^book_list/$',Search_book.as_view()), # views.p ...

  8. drf框架总结复习(1)

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

  9. 0008 基于DRF框架开发(01 DRF开发的基本流程)

    1 创建模型 由于之前在<004 工程配置>中,已在Applications/Organizations/models中创建了一个UserInfo模型.此处引用这个模型. from dja ...

随机推荐

  1. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  2. 线程与进程 queue模块

    queue模块的基本用法 https://www.cnblogs.com/chengd/articles/7778506.html 模块实现了3种类型的队列,区别在于队列中条目检索的顺序不同.在FIF ...

  3. List列表删除值为指定字段

    需要处理一个场景,当值为某一个固定值或者为空的时候,删除列表中的这个值. ;i<list.size();i++){ if(list.get(i).equals("del")) ...

  4. Mac Go 环境变量配置

    GOPATH 是工作目录,就是你打代码,代码的存放目录 GOROOT 是Go的安装目录,我下载的是免安装版的 现在的Go环境变量就是设置成这个样子, 终于Bee不会报错了!!!

  5. PAT 2012 冬

    A Shortest Distance 题意相当于一个环,找出两点间从不同方向得到的距离中的最小值. #include <cstdio> #include <iostream> ...

  6. POJ - 3657 Haybale Guessing(二分+并查集)

    题意:有N个大小各不相同的点,给定Q个询问,格式为q1,q2,A,表示区间q1~q2的最小值是A,问第一个与之前询问结果出现冲突的询问. 分析: 1.二分询问的标号mid,查询1~mid是否出现询问冲 ...

  7. 洛谷 P5662 纪念品

    题目传送门 解题思路: 一道DP,完全背包,不过有点不同于模板.因为本题的每件物品可自由在不同的时间买卖,且不同时间价格不同. 这道题的关键在于要明白一个非常傻逼的性质,就是我在某天买了第i个物品,然 ...

  8. JFrame的面板结构和JPanel的使用

    JFrame图解结构 有一窗口框架实例:JFrame win = new JFrame("窗口");在new JFrame()时,构建了JFrame实例对象,在实例中的Layere ...

  9. POJ-2492 A Bug's Life(种类并查集)

    http://poj.org/problem?id=2492 题意: 给出一个T代表几组数据,给出一个n一个m,代表人的编号由1~n,m条命令,每条命令由两个数值组成,代表这两个人性别不同,问所有命令 ...

  10. linux环境java程序cpu爆表问题查证

    1.top命令查找导致cup爆表的进程 2. top -H -p10832 (10832是Java进程的PID)命令找出了具体的线程 3.使用用命令 jstack 10832> jstack.t ...