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. springboot启动项目报错:ERROR:o.s.b.d.LoggingFailureAnalysisReporter解决办法

    原因是引入了spring security的依赖,将spring security对应的依赖删除即可. 具体可参照: https://blog.csdn.net/qq_37887131/article ...

  2. zabbix_agent_win

    http://mayulin.blog.51cto.com/1628315/514447/ http://www.cnblogs.com/likehua/p/3968689.html 先下载win客户 ...

  3. 十一、CI框架之输出用户IP地址

    一.代码如下: 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  4. java集合对象实现原理

    1.集合包 集合包是java中最常用的包,它主要包括Collection和Map两类接口的实现. 对于Collection的实现类需要重点掌握以下几点: 1)Collection用什么数据结构实现? ...

  5. 关于GAN的一些笔记

    目录 1 Divergence 1.1 Kullback–Leibler divergence 1.2 Jensen–Shannon divergence 1.3 Wasserstein distan ...

  6. 吴裕雄--天生自然Django框架开发笔记:Django Nginx+uwsgi 安装配置

    Django Nginx+uwsgi 安装配置 使用 python manage.py runserver 来运行服务器.这只适用测试环境中使用. 正式发布的服务,需要一个可以稳定而持续的服务器,比如 ...

  7. 利用libpcap抓取数据包

    转载自:http://blog.csdn.net/tennysonsky/article/details/44811899 概述 libpcap是一个网络数据包捕获函数库,tcpdump就是以libp ...

  8. Codeforces 1290B/1291D - Irreducible Anagrams

    题目大意: 两串字符串 s 和 t 是否 anagrams(下文简称ANA) 的定义是: 是否能将 s 内的字母打乱顺序后再拼接得到 t 我们考虑互相ANA的两串字符串 s 和 t 我们称 t 是 s ...

  9. MySQL高负载优化

    MySQL配置文件优化 [client] port = #客户端端口号为3306 socket = /data//mysql.sock # default-character-set = utf8 # ...

  10. input框随输入的文字的多少自动调整宽度粗略版本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...