Django(46)drf序列化类的使用(ModelSerializer)
前言
我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer
ModelSerializer
先来看下ModelSerializer的代码结构如下:

可以看到ModelSerializer是继承自Serializer,官方是这么介绍到的
ModelSerializer只是一个常规的Serializer,只是做了以下事情
- 将自动填充一组默认字段
- 将自动填充一组默认验证程序
- 提供了默认的
.create()和.update()实现
我们将之前的Serializer类现在用ModelSerializer来实现
class StudentModelSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ['id', 'name', 'age', 'sex']
默认情况下,所有的模型的字段都将映射到序列化器上相应的字段。
如果你希望在模型序列化器中使用默认字段的一部分,你可以使用fields或exclude选项来执行此操作
- fields:需要哪些模型字段
- exclude:排除哪些模型字段
官方强烈建议你使用fields属性显式的设置要序列化的字段。这样就不太可能因为你修改了模型而无意中暴露了数据。
如果我们需要使用模型的全部字段,则可以将fields属性设置成'__all__'
默认情况下,fields里的字段既参加序列化也参加反序列化,如果我们想某个字段只序列化或反序列化可以定义extra_kwargs字段,代码如下:
class StudentModelSerializer(serializers.ModelSerializer):
# classes = ClassesModelSerializer(read_only=True)
class Meta:
model = Student
fields = ['id', 'name', 'age', 'sex', 'password']
extra_kwargs = {
"password": {
"write_only": True
},
"id": {
"read_only": False
}
}
上面代码如果不写extra_kwargs,那么password默认参加序列化和反序列化,那么密码就会返回给前端了,这里我们定义了extra_kwargs字段,在字段中设置了password只能反序列化,那么用户只能提交密码,而后台不会返回密码给前台
当然,extra_kwargs也可以自定义错误信息,如果业务有需要,可以查看官方文档
指定嵌套序列化
上面我们都是单模型的序列化,但是实际业务中我们不会这么简单,一定会遇到关系模型的序列化,下面我们来讲解关系模型的序列化
首先我们看一下models模型内容:
class Classes(models.Model):
name = models.CharField(max_length=20, verbose_name="班级名")
class Meta:
db_table = "classes"
class Student(models.Model):
SEX_CHOICES = (
(1,'男'),
(2, '女')
)
name = models.CharField(max_length=20, verbose_name='姓名')
age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
sex = models.IntegerField(choices=SEX_CHOICES, default=1, verbose_name='性别')
classes = models.ForeignKey(Classes, on_delete=models.SET_NULL, verbose_name="班级", null=True, related_name='students')
class Meta:
db_table = "student"
我们定义了Student学生类,里面定义了一个外键classes关联Classes,一个班级中可以有多个学生,而一个学生只能属于一个班级,典型的一对多的关系,接下来我们看序列化函数
class ClassesModelSerializer(serializers.ModelSerializer):
class Meta:
model = Classes
fields = ['id', 'name', 'students']
class StudentModelSerializer(serializers.ModelSerializer):
classes = ClassesModelSerializer(read_only=True)
class Meta:
model = Student
fields = ['id', 'name', 'age', 'sex', 'classes']
我们在StudentModelSerializer中增加了一个额外的字段classes,并将字段设置为只读,一般外键只做序列化,并且在fields列表中添加了该字段。
注意:我们在创建外键模型时,必须在外键中设置related_name,如果没设置,序列化时不会返回关联的外键内容
接下来我们访问http://127.0.0.1:8000/drf/student/,会看到返回的学生表中包含了班级表的内容,如下
{
"id": 1,
"name": "jkc",
"age": 18,
"sex": 1,
"classes": {
"id": 1,
"name": "班级1",
"students": [
1,
15,
18
]
}
},
Django(46)drf序列化类的使用(ModelSerializer)的更多相关文章
- Django的DRF序列化方法
安装rest_framework -- pip install djangorestframework -- 注册rest_framework序列化 -- Python--json -- 第一版 用v ...
- Django(45)drf序列化类的使用(Serializer)
前言 上一篇文章我们讲述了序列化,这篇就带大家一起来实现以下序列化 Serializer 我们使用序列化类Serializer,我们来看下源码结构,这里推荐使用pycharm左边导航栏的Structu ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- DRF 序列化组件
Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...
- django rest_framework Serializers 序列化组件
为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- django rest framework 序列化组件总结
序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...
- python 全栈开发,Day95(RESTful API介绍,基于Django实现RESTful API,DRF 序列化)
昨日内容回顾 1. rest framework serializer(序列化)的简单使用 QuerySet([ obj, obj, obj]) --> JSON格式数据 0. 安装和导入: p ...
- 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)
知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...
随机推荐
- Ubuntu 快速安装Gitlab-ce
1.下载并安装gitlab,下载地址: https://packages.gitlab.com/gitlab/gitlab-ce/ sudo dpkg -i gitlab-ce_12.0.3-ce.0 ...
- 痞子衡嵌入式:实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形(无缓存)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形. 上一篇文章 <i.MXRT中FlexSPI外设对A ...
- 【接口参数解析BUG】SpringMVC接口参数解析
今天遇到一个BUG,前端传递数字数组时,后端使用字符串类型去接收,结果无法接收到,代码如下 问题: GET请求: 前端: configJsonArray:[1,2] 后端: private Strin ...
- ZOJ 3781 最短路(想法好题目)
题意: 给你一个n*m的矩阵,上面只有两种字符,X或者O,每次可以同时改变相同颜色的一个连通块,上下左右连通才算连通,用最小的步数把这个图弄成全是X或者全是O,题意要是没看懂看下面的样例. ...
- WindowsPE 第七章 资源表
资源表 在程序设计中,总会设计一些数据.这些数据可能是源代码内部需要用到的常量,菜单选项.界面描述等:也可能是源代码外部的,比如程序的图标文件.北京音乐文件.配置文件等,以上这些数据统称为资源.按照程 ...
- unresolved external symbol _WinMain@16
vc下,新建一个win32项目,就写了个main函数,打印hello ,出现了如标题所述的错误 原因: 你建立了一个WINDOWS应用程序,可是你却在入口函数的时候使用main而不是WinMain 解 ...
- (邹博ML)凸优化
目录 凸集的基本概念 凸函数的基本概念 凸优化的一般提法 凸集基本概念 思考两个不能式 两个正数的算术平均数大于等于几何平均数 给定可逆对称阵Q,对于任意向量x,y,有: 思考凸集和凸函数 在机器学习 ...
- vscode 终端操作命令npm报错
错误: 如果没有安装的node.js ,则需要安装. node.js官网下载地址: https://nodejs.org/zh-cn/ 安装node.js 后会看到C:\Users\XXX\AppDa ...
- Java中浮点数的坑
基本数据类型 浮点数存在误差 浮点数有一个需要特别注意的点就是浮点数是有误差的,比如以下这段代码你觉得输出的什么结果: public class Demo { public static void m ...
- Windows进程间通讯(IPC)----套接字
Windows套接字 Windows套接字即socket,通过socket可以实现在不同的进程间通信,甚至这两个进程可以不在同一个计算机中. Winsock使用步骤 服务端 socket初始化 创建套 ...