首页 > 其他分享 >09-序列化器的 many=True 实现原理

09-序列化器的 many=True 实现原理

时间:2023-12-06 16:46:28浏览次数:30  
标签:many 09 ListSerializer init representation 序列化 data

入门知识

上面说明了,解释器会先执行 new 方法,再执行 init方法
下面说明了,如果new返回的空对象不是当前init对应的类型,就不会执行init。

序列化器 many=True 的简化版

可以看到 many_init 方法返回的是 Alist的空对象,而不是 A 的空对象,因此,没有 A init 打印

1. BookSerializer(data=data, many=True)

BaseSerializer 是个基类,上面语句执行之后,图片中这四处地方按照序号执行。
【1】首先执行的是 __new__方法,如果参数中可以弹出一个 many,则走 many_init 类方法
【2】先将所有的参数放到当前的序列化起类中,然后变成参数,生成了一个 list_kwargs 字典,并将其传递给了默认的 ListSerializer 列表序列化器[如果没有在 Meta 里面配置的话],这里返回的是一个对象,于是又要走一遍【1】
由于第二次走【1】,已经去掉了many参数,所有走的是常规的new方法,也就是代码块【3】
执行完了【3】之后,返回的是一个列表序列化器的空对象,紧接着解释器会调用【4】完成初始化
【4】这次执行的是 列表序列化器的初始化
最终【1】返回的是列表序列化器完成了初始化的对象。由于这个对象不是非列表序列化器的对象,因此不会再执行初始化操作了。

列表序列化器的data

这里尝试返回一个 ReturnList 对象,但是这个对象只是python列表的加强版,因此最终还是要看 ret = super().data这行代码,也就是最终还是调用 BaseSerializer.data 方法。

BaseSerializer.data

这里有三种返回,其中两个返回的是 to_representation 方法的返回值,一个返回的是 get_initial 的返回值,那我们先去看看 get_initial 的代码,注意 ListSerializer 也有该方法,所以最终调用的是 ListSerializer 的 get_initial 方法

最终还是调用 to_representation 方法。所以我们需要去看看 ListSerializer.to_representation

ListSerializer.to_representation

【1】如果data是一个 Manager 对象,则调用 data.all() 否则就使用 data本身
【2】遍历每一个元素,并且调用 Serializer.to_representation 方法,完成序列化

总结 Serializer 和 ListSerializer 均继承自 BaseSerializer,在两个类的 to_representation 方法了实现了调用的统一。

标签:many,09,ListSerializer,init,representation,序列化,data
From: https://www.cnblogs.com/yaowy001/p/17879708.html

相关文章

  • 09 补+bbs
    Auth的使用#django的一个app---》用户的登录,退出,注册#配置文件中配置:---》表会被迁移 INSTALLED_APPS=['django.contrib.auth', ]#auth有哪些表---权限控制: -Permission:auth_permission-Group:auth_group-User:auth_user--->密码加密--》-auth_group_per......
  • 个人月度总结-202309
    个人月度报告1.本月计划新加坡:DBS对接准备及初步接口开发泰国:解决Omise支付,用户支付成功,但业务处理失败问题后管系统行程上诉和行程审核列表添加错误类型行程审核列表,数据导出后错乱FOMOPay列表,费率1.1%计算不准确邮箱认证时,发件邮件由atayun.com变更为iotwhe......
  • 搭建DG备库Recover database报错ORA-19909、ORA-01110
    一、问题现象客户环境LinuxOracle11.2.0.4两节点RAC主库,2节点备库;需要对这个客户的数据库使用dg切换进行迁移;第一轮搭建ADG完成后,failoverDG备库变成测试库给开发应用人员进行测试;第二轮正式切换之前,搭建重建ADG环境,restoredatabase正常,recoverdatabase报错ThuOct......
  • 2023-2024-1 20231309 《计算机基础与程序设计》第十一周学习总结
    2023-2024-120231309《计算机基础与程序设计》第十一周学习总结这个作业属于哪个课程<2023-2024-1-计算机基础与程序设计>这个作业要求在哪里<2023-2024-1计算机基础与程序设计第十一周作业>这个作业的目标<《计算机科学概论》第十五章,《C语言程序设计》第十章,上周......
  • uniapp 微信小程序 onLaunch触发vuex 请求http报错600009?
    当在uniapp中的微信小程序中使用vuex触发http请求时,出现错误码600009通常表示网络请求发生了错误或失败。这个错误码通常不是uniapp或vuex特定的错误码,而是微信小程序的错误码。以下是一些可能导致此错误的原因和解决方法:网络连接问题:首先,确保您的设备已连接到互联网,并且网络连接稳......
  • day09
    1.今日内容介绍今日内容:1.字符编码(******)2.文件处理的高级部分(1)文件处理的其他方法(2)控制文件指针移动(3)文件修改的两种方式3.函数的基本使用函数名参数函数体代码函数的返回值2......
  • uva12096集合栈计算机 The SetStack Computer
    洛谷链接集合栈计算机TheSetStackComputer-洛谷|计算机科学教育新生态(luogu.com.cn)一道典型的以栈为背景的数据结构题。题目简单但是程序却并不简单(个人观点)。普及组的难度有点低了感觉。个人认为这道题目可以帮助自己熟悉或者说更好的掌握STL的使用以及妙用。难点:1......
  • csp认证202109-4——之状态压缩dp加期望(记忆化搜索
    https://www.acwing.com/problem/content/description/4012/#include<bits/stdc++.h>usingnamespacestd;#definelllonglong//#defineintlonglong#defineullunsignedlonglong#definepiipair<int,int>//#definedoublelongdouble#define......
  • Codeforces Round 909 (Div. 3)
    CodeforcesRound909(Div.3)A#include<bits/stdc++.h>#defineintlonglong#defineendl'\n';usingnamespacestd;intn;voidsolve(){cin>>n;for(inti=1;i<=10;i++){if(i&1){if(n%3==0)n++;......
  • Day09 方法知识点综合(求值策略与可变参数)
    1.求值策略编程语言中方法之间进行参数传递时有个传递策略,该策略就被称为求值策略(Evaluationstrategies)。求值策略分为两大基本类型,如果按照如何处理传递给方法的实际参数,分为严格的和非严格的两种求值策略。1.1严格求值策略传值调用(Callbyvalue)将实参复制一份给形参......