【Django drf】序列化器总结
序列化器字段
序列化中的字段可以根据用途分为三种:
既用于序列化,也用于反序列化
普通字段只用于序列化 (读) (read_only)
外键字段只用于反序列化 (写) (write_only)
外键字段

外键字段自定义序列化
由于普通字段比较简单,以下针对外键字段进行总结:
序列化:
模型表 ----> 序列化类 ----> 前端
自定义序列化通常使用于外键字段,因为这些字段无法直接跟数据关联,如果在序列化器中直接填写外键字段前端会出现如下现象:

自定义序列化是为了给前端返回json格式字符串,而想要自定义序列化有两种方法:
在模型类中写方法
- 在模型类中写方法
数据库查询到数据 ---> 执行模型类中方法 --返回值--> 序列化类中字段 --序列化-> 前端
如果模型类中方法返回一个字典 ,在序列化类中使用DictField序列化。
如果模型类中方法返回一个列表 ,在序列化类中使用ListField序列化。

在序列化类中写方法
- 在序列化类中写方法,配合SerializerMethodField字段
SerializerMethodField:
这是一个只读字段。
它通过调用附加到的序列化程序类上的方法来获取其值。
它可用于将任何类型的数据添加到对象的序列化表示中。
数据库查询到数据 ---> 执行SerializerMethodField() ---> 执行序列化类中方法 --返回值--> json.dumps --序列化-> 前端

反序列化
模型表 <---- 序列化类 <---- 前端
外键字段反序列化保存
模型表 <-- 序列化类中create、updata等方法-- 序列化类中字段 <--主键-- 前端

ModelSerializer使用总结
# 如何使用
1 定义一个类继承ModelSerializer
2 类内部写内部内 class Meta:
3 在内部类中指定model
填写要序列化的表
4 在内部类中指定fields
写要序列化的字段,写__all__表示所有,__all__不包含方法,如果要包含方法必须要在列表中写一个个字段。
示例:['字段1','字段2'...]
5 在内部类中指定extra_kwargs,给字段添加字段参数的
因为有些字段是从模型类映射过来的,在序列化类中没有这个字段,所以需要使用extra_kwargs添加字段参数。
6 在序列化类中,可以重写某个字段,优先使用你重写的
name = serializers.SerializerMethodField()
def get_name(self, obj):
return 'sb---' + obj.name
7 以后不需要重写create和update了
-ModelSerializer写好了,兼容性更好,任意表都可以直接存(考虑了外键关联)
-当有特殊需求的情况下,也可以重写
# 在modelserialzer中写其他模型表字段
此时需要在modelserialzer类中重写create方法,因为modelserialzer内部的create只会对序列化类中指定的模型类进行操作,而不会对指定之外的类进行操作。
【Django drf】序列化器总结的更多相关文章
- drf序列化器serializers.SerializerMethodField()的用法
问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...
- DRF序列化器
序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典 ...
- DRF序列化器的使用
序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...
- DRF 序列化器-Serializer (2)
作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...
- drf序列化器与反序列化
什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...
- 怎样快速高效的定义Django的序列化器
1.使用Serializer方法自己创建一个序列化器 先写一个简单的例子 class BookInfoSerializer(serializers.Serializer): ""& ...
- 对drf序列化器的理解
序列化: 将对象的状态信息转换为可以存储或传输的形式的过程.(百度定义) 对应到drf中,序列化即把模型对象转换为字典形式, 再返回给前端,主要用于输出 反序列化: 把其他格式转化为程序中的格式. 对 ...
- Django:(08)序列化器
1.序列化和反序列化变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上.反过来,把变量内容从序列化的对象重新读到内存里称之为反序列 ...
- 关于定义序列化器时,read_only和write_only有什么作用
关于序列化和反序列化 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...
随机推荐
- Educational Codeforces Round 125 (Rated for Div. 2) E. Star MST
折磨了我三天的\(DP\),终于看懂啦. 首先,如果想要有题目要求的效果,那么最短的边一定都是与\(1\)相连的,就是一个菊花图,生成树里的边就是最短的边. \(f[i][j]\)表示已经有\(i\) ...
- WPS JS宏
WPS JS宏 1 JS宏基础 1.1 JS宏基础 1.1.1 JS录制新宏 如果在WPS表格中要编写控制表格的代码,却又不知道如何编写,那么可以使用JS录制新宏功能,接下来录制几个常用的操作: 录制 ...
- 什么是cursor?怎么使用cursor?
Cursor 在Android查询数据时就是通过Cursor类来实现的.当我们使用SQLiteDatabase.query()方法时,就会得到Cursor对象,Cursor所指向的就是每一条数据. 举 ...
- preparedStatement.setString()方法
PreparedStatement作用:PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 1.预编译sql语句,效率高 2.安全,避免sql注入 3 ...
- linux-ELK安装配置
前言: ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kibana. • Elasticsearch 是一个搜索和分析引擎. ...
- 手撸一个SpringBoot配置中心实现配置动态刷新
业务需求 SpringBoot项目配置信息大多使用@Value注解或者@ConfigurationProperties注解读取配置信息,线上项目经常需要对某些配置进行调整,如果每次都需要修改配置文件再 ...
- 在Linux服务器上装jenkins(方式二:rpm包)
官网下载jenkins https://www.jenkins.io/zh/download/ 上面比较慢,我们从清华大学开源镜像站下载安装包:https://mirrors.tuna.tsinghu ...
- 常用API之IP定位地区
常用API之IP定位地区 高德地图API https://lbs.amap.com/api/webservice/guide/api/ipconfig 百度地图API https://lbsyun.b ...
- 【OpenCV】在MacOS上使用OpenCvSharp
前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Andr ...
- 2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常大,到达10^12规模。 结果可能更大,所以返回结果对1000000007取模。 来自华为
2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常大,到达10^12规模. 结果可能更大,所以返回结果对1000000007取模. 来自华为 ...