DRF序列化和反序列化(二:ModelSerializer)
一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer)
a:需要定义每一个字段,并且这个字段是和models字段及其类似。
b:和froms是不是很像,有没有类似ModelFroms类似的模块,简化字段的编写,当然有ModelSerializer就是这中类型
二:ModelSerializer序列化
a:view中的文件不需要修改
b:重新编写BookSerializers继承serializers.ModelSerializer
--model 指定哪一个model
--fields 表示需要序列化的字段,"__all__"全部字段
--depth 向下查找一层。指对外键关系会继续遍历外键对象的全部属性。(但是如果外键表字段过多,而前端需要的字段并不是很多,使用起来会不方便。所以常常不用)
1
2
3
4
5
6
7
|
class BookSerializers(serializers.ModelSerializer): class Meta: model = Book # fields=['title','category','publisher','authon'] #可以对字段进行排序 fields = "__all__" #所有的字段,但是无序 depth = 1 #向下查找一层 |
c:对部分字段,如外键,choices字段,进行自定义序列化
--需要结合反序列化一起使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class BookSerializers(serializers.ModelSerializer): #部分字段自定义 字段定义后 fields字段一定要展现 category_display = serializers.CharField(source = "get_category_display" ,read_only = True ) ##处理一对多关系 调用SerializerMethodField()方法 publisher_id = serializers.SerializerMethodField(read_only = True ) def get_publisher_id( self ,obj): publisher_obj = obj.publisher return { "id" :publisher_obj. id , "title" :publisher_obj.title} #处理多对多 authons = serializers.SerializerMethodField(read_only = True ) def get_authons( self ,obj): authon_query_list = obj.authon. all () return [{ "id" :authon_query. id , "name" :authon_query.name} for authon_query in authon_query_list] class Meta: model = Book # fields=['title','category','publisher','authon'] #可以对字段进行排序 fields = "__all__" #所有的字段,但是无序 #depth=1 #向下查找一层 |
三:ModelSerializer反序列化
--extra_kwargs字段设置对应的字段反序列化
--提交的数据,和models字段一样。外键关系传递id即可
--会自动添加数据
1
2
3
4
5
6
7
8
9
10
11
12
|
class Meta: model = Book # fields=['title','category','publisher','authon'] #可以对字段进行排序 fields = "__all__" #所有的字段,但是无序 #设置反序列化的字段 write_only extra_kwargs = { 'category' :{ 'write_only' : True }, 'publisher' : { 'write_only' : True }, 'authon' : { 'write_only' : True }, } |
四:路由分发注意点
a:path('retrieve/<int:pk>',views.BookEditView.as_view()) #id修改成pk
五:序列化小结
DRF序列化和反序列化(二:ModelSerializer)的更多相关文章
- drf序列化和反序列化
目录 drf序列化和反序列化 一.自定义序列化 1.1 设置国际化 二.通过视图类的序列化和反序列化 三.ModelSerializer类实现序列化和反序列化 drf序列化和反序列化 一.自定义序列化 ...
- drf序列化与反序列化
序列化器-Serializer 定义序列化器 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serial ...
- Django(46)drf序列化类的使用(ModelSerializer)
前言 我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer ModelSerializer 先来看下ModelSer ...
- drf序列化及反序列化
假如把drf看做一个汉堡包,我们之前讲的模块属于汉堡包前面的盖盖(请求模块.渲染模块)和底底(异常模块.解析模块.响应模块),但是真正中间的夹心没有讲,那么今天我就和大家来看一下汉堡包的夹心(序列化及 ...
- drf序列化器与反序列化
什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...
- DRF框架(二)——解析模块(parsers)、异常模块(exception_handler)、响应模块(Response)、三大序列化组件介绍、Serializer组件(序列化与反序列化使用)
解析模块 为什么要配置解析模块 1)drf给我们提供了多种解析数据包方式的解析类 form-data/urlencoded/json 2)我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些 ...
- DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)
media资源路径设置 (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ...
- drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族
目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...
- ModelSerializer,序列化与反序列化整合
复习 """ 1.解析模块:全局局部配置 REST_FRAMEWORK = { # 全局解析类配置 'DEFAULT_PARSER_CLASSES': [ 'rest_f ...
随机推荐
- 让sentinel-dashboard支持nacos
以sentinel-1.7.0为例 下载源码,idea打开. 找到sentinel-dashboard这个项目 在该项目下的pom.xml文件中找到: <!-- for Nacos rule p ...
- 【操作系统之三】Linux下进程间通信-IPC(Inter-Process Communication)
管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:信号(Sign ...
- .NET Core 获取自定义配置文件信息
前言 .net core来势已不可阻挡.既然挡不了,那我们就顺应它.了解它并学习它.今天我们就来看看和之前.net版本的配置文件读取方式有何异同,这里不在赘述.NET Core 基础知识. ps:更新 ...
- nginx+keepalived高可用及双主模式【h】
高可用有2中方式. 1.Nginx+keepalived 主从配置 这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候, ...
- ORM之模型对象Model
模型对象Model Odoo的模型对象在odoo模块的models.py文件中,最基础的对象是BaseModel; Odoo的模型对象有三个:AbstractModel.Model.Transient ...
- Python【每日一问】33
问: [基础题1]:设计一个重量转换器,输入以“g”为单位的数字后返回换算成“kg”的结果 [基础题2]:设计一个求直角三角形斜边长的函数,比如直角边长分别为3和4,输出结果为:The right t ...
- linux shell提示输入 输错字符解决方法
linux shell提示输入 输错字符解决方法ctrl+回车 删除单个字符ctrl+u删除光标前全部字符ctrl+k删除光标后全部字符
- python 基础 ---- 文件读写
文件是一种存储在存储存储媒介上的信息或数据 常用的文件类型 文件 的打开关闭 close() 关闭文件 文件的打开路径 绝对路径 : 文件在操作系统中标准的存放路径 相对路径: 与目前引用文件的相对位 ...
- Codeforces Round #557 (Div. 1) 简要题解
Codeforces Round #557 (Div. 1) 简要题解 codeforces A. Hide and Seek 枚举起始位置\(a\),如果\(a\)未在序列中出现,则对答案有\(2\ ...
- [Atcoder AGC032C]Three Circuits
题目大意:有一张$n$个点$m$条边的无向连通图,判断是否可以从中分出$3$个环,满足三个环覆盖整张图并且没有重复的边.$n,m\leqslant10^5$ 题解:分类讨论.有度数为奇肯定不行,因为连 ...