源码分析之序列化器的many关键字

yizhihongxing

在序列多个数据时,我们需要指定一个关键字many=True
image

这是为什么呢?

其实是,当序列化器产生对象时,传入参数many和不传入会生成两个不同的对象!!

这是怎么实现的呢??

1.类的对象生成--先调用类的__new__方法生成一个空对象
2.对象 = 类名(name=‘lz’)--会触发类的__init__方法,产生一个有属性的对象
3.类的__new__方法是控制对象生成

所以,找BookSerializer类的__new__方法,该类没有就往它的父类找,最后在BaseSerializer这个类中找到了__new__方法!!

    def __new__(cls, *args, **kwargs):
        if kwargs.pop('many', False):
            # 当 传入many=True 执行类的many_init方法
            return cls.many_init(*args, **kwargs)
        # 当未传入时,正常生成我们定义的序列化器类
        return super().__new__(cls, *args, **kwargs)

many_init该方法意思是单次生成多个我们自己定义的BookSerializer对象,然后添加到列表中!!


    @classmethod
    def many_init(cls, *args, **kwargs):
        allow_empty = kwargs.pop('allow_empty', None)
        max_length = kwargs.pop('max_length', None)
        min_length = kwargs.pop('min_length', None)
        child_serializer = cls(*args, **kwargs)
        list_kwargs = {
            'child': child_serializer,
        }
        if allow_empty is not None:
            list_kwargs['allow_empty'] = allow_empty
        if max_length is not None:
            list_kwargs['max_length'] = max_length
        if min_length is not None:
            list_kwargs['min_length'] = min_length
        list_kwargs.update({
            key: value for key, value in kwargs.items()
            if key in LIST_SERIALIZER_KWARGS
        })
        meta = getattr(cls, 'Meta', None)
        list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
        return list_serializer_class(*args, **list_kwargs)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:源码分析之序列化器的many关键字 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • rest_framework认证源码分析

    认证源码分析 位置 : APIVIew—-》dispatch方法—》self.initial(request, *args, **kwargs)—->有认证,权限,频率三个版块 分析: 只读认证源码: self.perform_authentication(request)—》self.perform_authentication(re…

    2023年4月2日
    00
  • 个人站点页面搭建和侧边栏展示功能

    展示个人站点页面 前端代码:和首页文章展示基本一样: <div class=”col-md-8″> {% for article in article_list %} <ul class=”media-list”> <li class=”media”> <a href=””><h4 class=”medi…

    Python开发 2023年4月2日
    00
  • django中的request对象方法

    1.什么是request对象 在django中,当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象;Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。 2.request对象的作用 request对象里面封装了请求时拿到的数据,我们可以通过request.的…

    Python开发 2023年4月2日
    00
  • 基于django中间件的编程思想

    基于django中间件的编程思想 在django中,中间件的形式全部写成了列表套字符串的形式 MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middl…

    2023年4月2日
    00
  • django中APIView里的dispatch和as_view方法分析

    位置: from rest_framework.views import APIView 继承APIView类视图形式的路由: path(‘booksapiview/’, views.BooksAPIView.as_view()), #在这个地方应该写个函数内存地址 继承APIView类的视图函数: from rest_framework.views imp…

    Python开发 2023年4月2日
    00
  • 进程、线程补充与协程相关介绍

    补充点 1.死锁 当你知道锁的使用抢锁必须要释放锁,其实你在操作锁的时候也极其容易产生死锁现象(整个程序卡死 阻塞) from threading import Thread, Lock import time mutexA = Lock() mutexB = Lock() # 类只要加括号多次 产生的肯定是不同的对象 # 如果你想要实现多次加括号等到的是相…

    Python开发 2023年4月2日
    00
  • 关于编辑器和解释型编译型语言

    各种语言用到的编辑器 python开发:pycharm(收费),vscode(免费),sublintext, go开发:goland(收费),vscode,国产的 java:idea(收费),eclipse(免费),MyEclipse(收费) android:androidstudio(免费),eclipse+adt 前端:webstorm(收费) php:…

    Python开发 2023年4月2日
    00
  • 过滤组件、排序组件、全局异常处理、自己封装的response对象

    过滤组件 查询所有才涉及到过滤,其他接口都不需要restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤 内置过滤类 使用内置过滤类的步骤 from rest_framework.filters import OrderingFilter,SearchFilter 必须是继承GenericAPIView+ListModelMixin的之类…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部