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.序列化准备 ...
随机推荐
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- 05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言 书接上文.项目第一个组件已经封装好,说明文档也已编写好.下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages功能实现.同时将组件发布之 npm 上,方便 ...
- Java JFR 民间指南 - 事件详解 - jdk.ThreadAllocationStatistics
定时线程分配统计事件:jdk.ThreadAllocationStatistics 引入版本:Java 11 相关 ISSUES: Test jdk/jfr/event/runtime/TestThr ...
- Swagger快速入门教程笔记
现在市面上大多数公司都摒弃了传统 jsp 开发,采用前后端分离式的开发规则,前端使用 Vue,Angular,React 等等完成页面,后端省掉了视图跳转的过程,直接书写接口返回 json 数据供前端 ...
- HttpContext访问的正确姿势
本文章转发自:https://www.cnblogs.com/tianqing/p/12570801.html 使用HttpContext的具体场景: 1. 在Controller层访问HttpCon ...
- 【SpringBoot】Springboot2.x整合Redis(一)
备注: springboto整合redis依赖于spring-boot-starter-data-redis这个jar 一,项目环境和依赖 1.POM.xml配置 <parent> < ...
- 基于MXNET框架的线性回归从零实现(房价预测为例)
1.基于MXNET框架的线性回归从零实现例子 下面博客是基于MXNET框架下的线性回归从零实现,以一个简单的房屋价格预测作为例子来解释线性回归的基本要素.这个应用的目标是预测一栋房子的售出价格(元). ...
- Idea一直卡在loading archetype list问题解决(或者报Unable to import maven project: See logs for details)
暂时没有测试成功 https://blog.csdn.net/calo_missile/article/details/95898519
- [题解] CF786B Legacy
前言 题目链接 题意 有 \(n\) 个点,\(q\) 次连边,以及起点 \(s\) .连边具体分三种: \(1\) \(v\) \(u\) \(w\) 从 \(v\) 到 \(u\) 连一条边. \ ...
- 浅谈Java的诞生和现状
昨天在旅途中登录一下很久没用的boss直聘,看看行情,一天的时间,已经有20+家公司给我发出了面试邀请,先跟大家谈谈Java的诞生和现状. 传说,在二十世纪90年代,一个叫Sun的公司,成立了一个项目 ...