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. 【shell】常用shell脚本

    1.检查主机存活状态 #!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2" for IP in $IP_LIST; ...

  2. Essay写作关键:严谨的逻辑关系

    一篇好的文章并不是句子的机械堆砌,而是一个有机整体,句子和句子之间是存在严谨的逻辑关系的,要注意句子和句子之间,段落和段落之间的衔接和连贯(Coherence and Cohesion). 要写出逻辑 ...

  3. gentoo 修改键盘映射

    gentoo 上面修改键盘映射分为两种,一种是终端环境,一种是X环境. 终端环境 https://www.emacswiki.org/emacs/MovingTheCtrlKey https://wi ...

  4. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  5. php 常用编译参数

    安装依赖 yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng li ...

  6. DLL对应的导入库一定会生成的

    测试代码: #pragma once #define TESTDEPEND_EXPORTS #ifdef TESTDEPEND_EXPORTS #define TESTDEPEND_API __dec ...

  7. Windows下Nodejs的开发环境搭建

    我为什么选择学习 Node.js Node.js是前后端分离开发的新选择.比较热门的前端框架React,Vue都可以在Node.js环境上开发. Node.js 是一个基于 Chrome V8 引擎的 ...

  8. 最短路问题--Floyd 畅通工程续

    畅通工程续 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很 ...

  9. Codeforces 997A Convert to Ones(思维)

    https://codeforces.com/problemset/problem/997/A 题目大意: 给定一串0-1序列,定义两种操作: 操作一:选取一连续串倒置. 操作二:选取一连续串把进行0 ...

  10. Restful设计相关

    1.get,从服务器获取资源. 2.post 新增资源. 3.put 更新完整资源. 4.patch 更新部分资源. 5. delete 删除资源.