Serializers 序列化组件——ModelSerializer详解
前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关。
django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer。
它会根据模型自动生成一组字段;它简单的默认实现了.update()以及.create()方法。
一、ModelSerializer序列化
1、定义ModelSerializer序列化器
# 针对models设计和声明序列化类
from rest_framework import serializers
from .models import Book, Publisher class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book # 与Book表对应 # 这三种情况不能同时使用
# 1.取全部字段
fields = "__all__" # 2.自定义包含字段
# fields = ["id", "title", "pub_time"]
# 输出:[{"id": 1, "title": "python开发", "pub_time": "2011-08-27"},...] # 3.排除某些字段
# exclude = ["id", "category","author", "publisher"]
# 输出:[{"title": "python开发", "pub_time": "2011-08-27"},...]
需要注意的是:取全部字段、取自定义字段、排除某些字段这三种筛选不能同时使用。
2、外键关系的序列化
注意:当序列化类META定义了depth时,这个序列化类中引用字段(外键)则自动变为只读。
depth 代表找嵌套关系的第几层。
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book # 与Book表对应
fields = "__all__"
depth = 1
添加depth前,显示效果:

添加depth后,显示效果:

由上图可知,只会查看嵌套深度一层的内容。
3、自定义字段
很多字段默认显示的是选择的key值,但要给用户展示的是value值。
因此可以声明一些字段来覆盖默认字段来进行自定制。
class BookSerializer(serializers.ModelSerializer):
category = serializers.CharField(source="get_category_display") # 找到对应中文 class Meta:
model = Book # 与Book表对应
fields = "__all__"
显示效果如下所示:

4、Meta中其他关键字参数
官方文档地址:https://www.django-rest-framework.org/api-guide/serializers/
(1)指定只读字段
希望将多个字段指定为只读。推荐使用快捷的Meta选项read_only_fields,而不是显式地使用read_only=True属性添加每个字段。示例如下所示:
class BookSerializer(serializers.ModelSerializer):
chapter = serializers.CharField(source="get_chapter_display", read_only=True) class Meta:
model = Book
fields = "__all__"
depth = 1
read_only_fields = ["id"]
模型字段有设置 editable=False, AutoField 字段默认设置为只读,不需要添加到 read_only_fields 选项。
(2)给字段添加额外参数——extra_kwargs
使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数---字典格式。
# 示例一:
class BookSerializer(serializers.ModelSerializer):
chapter = serializers.CharField(source="get_chapter_display", read_only=True) class Meta:
model = Book
fields = "__all__"
depth = 1
read_only_fields = ["id"]
extra_kwargs = {"title": {"validators": [my_validate,]}} # 示例二:
class CreateUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['email', 'username', 'password']
extra_kwargs = {'password': {'write_only': True}}
如果字段已在序列化程序类中显式声明,则该extra_kwargs选项将被忽略。
5、post和patch请求
由于depth会让外键变成只读,所以定义一个序列化的类,其实只要去掉depth就可以了。
class BookSerializer(serializers.ModelSerializer):
chapter = serializers.CharField(source="get_chapter_display", read_only=True) class Meta:
model = Book
fields = "__all__"
# fields = ["id", "title", "pub_time"]
# exclude = ["user"]
# 分别是所有字段 包含某些字段 排除某些字段
read_only_fields = ["id"]
extra_kwargs = {"title": {"validators": [my_validate,]}}
6、SerializerMethodField
外键关联的对象有很多字段是用不到的,都传给前端会有数据冗余。需要自己去定制序列化外键对象的那些字段。
# 针对models设计和声明序列化类
from rest_framework import serializers
from .models import Book, Publisher class BookSerializer(serializers.ModelSerializer):
category = serializers.CharField(source="get_category_display") # 找到对应中文 class Meta:
model = Book # 与Book表对应
fields = "__all__"
查看页面 http://127.0.0.1:8000/books/list,显示效果如下所示:

添加 SerializerMethodField的使用,获取显示外联字段:
class BookSerializer(serializers.ModelSerializer):
category = serializers.CharField(source="get_category_display") # 找到对应中文 # SerializerMethodField的使用,获取显示外联字段
publisher = serializers.SerializerMethodField()
author= serializers.SerializerMethodField() def get_author(self, obj):
authors_query_set = obj.author.all() # 拿到所有作者信息
return [{"id": authors_obj.id, "name": authors_obj.name} for authors_obj in authors_query_set] # 列表推导式 def get_publisher(self, obj):
# obj是我们序列化的每个Book对象
publisher_obj = obj.publisher # 正向查询
return {'id': publisher_obj.id} class Meta:
model = Book # 与Book表对应
fields = "__all__"
显示效果如下所示:

二、ModelSerializer反序列化
1、ModelSerializer原生POST请求
再将 SerDemo/serializers.py 下 BookSerializer 恢复为原生状态:
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book # 与Book表对应
fields = "__all__"
不用自定义create方法,可直接提交提交post请求如下:

数据新增成功,如下所示:

2、SerializerMethodField改写
class BookSerializer(serializers.ModelSerializer):
# SerializerMethodField的使用,获取显示外联字段
category_display = serializers.SerializerMethodField(read_only=True) # 重新定义,避免重写,影响反序列化
publisher_info = serializers.SerializerMethodField(read_only=True)
authors = serializers.SerializerMethodField(read_only=True) def get_category_display(self, obj):
return obj.get_category_display() # ORM方法获取中文 def get_authors(self, obj):
authors_query_set = obj.author.all() # 拿到所有作者信息
return [{"id": authors_obj.id, "name": authors_obj.name} for authors_obj in authors_query_set] # 列表推导式 def get_publisher_info(self, obj):
# obj是我们序列化的每个Book对象
publisher_obj = obj.publisher # 正向查询
return {'id': publisher_obj.id} class Meta:
model = Book # 与Book表对应
fields = "__all__"
显示效果如下所示:

可以从上图看到,除了显示了category_display、authors、publisher_info,也显示了category、publisher、author。
3、extra_kwargs配置字段参数
class BookSerializer(serializers.ModelSerializer):
# SerializerMethodField的使用,获取显示外联字段
category_display = serializers.SerializerMethodField(read_only=True) # 重新定义,避免重写,影响反序列化
publisher_info = serializers.SerializerMethodField(read_only=True)
authors = serializers.SerializerMethodField(read_only=True) def get_category_display(self, obj):
return obj.get_category_display() # ORM方法获取中文 def get_authors(self, obj):
authors_query_set = obj.author.all() # 拿到所有作者信息
return [{"id": authors_obj.id, "name": authors_obj.name} for authors_obj in authors_query_set] # 列表推导式 def get_publisher_info(self, obj):
# obj是我们序列化的每个Book对象
publisher_obj = obj.publisher # 正向查询
return {'id': publisher_obj.id} class Meta:
model = Book # 与Book表对应
fields = "__all__"
extra_kwargs = {
"category": {"write_only": True}, # 避免直接改写
"publisher": {"write_only": True},
"author": {"write_only": True}
}
如此就不再显示category、publisher、author了,显示效果如下所示:

三、Serializer与ModelSerializer区别

Serializers 序列化组件——ModelSerializer详解的更多相关文章
- Serializers 序列化组件
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...
- Django-Rest-Framework的序列化之serializers 序列化组件
Django-Rest-Framework的序列化之serializers 序列化组件 restful framework 正常的序列化 from django.http import HttpRes ...
- [安卓基础] 009.组件Activity详解
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- DRF框架之 serializers 序列化组件
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...
- drf3 Serializers 序列化组件
为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...
- django rest_framework Serializers 序列化组件
为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...
- 【转】Serializers 序列化组件
https://www.cnblogs.com/MayDayTime/p/9890582.html 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON ...
- drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)
ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...
随机推荐
- R语言-laohuji
项目三-tiger机 说明:每玩一次老ji游戏需要花费一元钱.钻石符号(DD)可以百搭,并且能够将最终的金额加倍. 任务分解: 任务分解的步骤: 将复杂的任务分解为一些简单的子任务: 使用实例: 用通 ...
- linux umask计算方法
1. umask用于设定默认的新建文件或目录的权限 查看umask当前值命令: umask -p 计算创建出的file权限方法: 如果umask值的每位数都是偶数,使用666按位减umask的值即可 ...
- The trap of Bash trap
Can you spot the problem with the following Bash script? resource_created="false" function ...
- React: React组件创建的三种方式
一.简介 在前面介绍的React组件知识中,对于组件的创建我只是用了其中某一种方式.其实,在2013年React诞生之初,对于React组件的创建,仅仅只有一种方式,也即createClass函数,在 ...
- php获取url中的参数
// 获取url参数值function is_set_param($param){ $current_url = $_SERVER["QUERY_STRING"]; $arr = ...
- Groovy元编程应用之自动生成订单搜索接口测试用例集
背景 在 "Groovy元编程简明教程" 一文中,简明地介绍了 Groovy 元编程的特性. 那么,元编程可以应用哪些场合呢?元编程通常可以用来自动生成一些相似的模板代码. 在 & ...
- PHP面试常考之设计模式——建造者模式
建造者模式 介绍 建造者模式又名生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 建造者模式是一步一步创建 ...
- SpringBoot系列之配置文件占位符使用
SpringBoot系列之配置文件占位符使用 Springboot占位符支持的有随机数和配置的值等等,本博客主要介绍的是随机数和获取属性配置值的简单用法 随机数获取 支持的写法有: ${random. ...
- vscode wsl git 换行符问题autocrlf
wsl中使用code,由于windows换行符问题git会显示大量文件修改,此时需要在wsl中设置autocrlf设置 git config --global core.autocrlf input ...
- C#中 ??、 ?、 ?: 、?.、?[ ] 问号各组合含义
1. 可空类型修饰符(?) 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型也 ...