zoukankan      html  css  js  c++  java
  • django drf 的serializer源码分析

    1,一般我们都是实例化调用data方法开始

    dimension_serializer = self.get_serializer(
                instance=queryset, many=True).data

    按继承关系,是调用serializer的data方法

    @property
        def data(self):
            ret = super(Serializer, self).data
            return ReturnDict(ret, serializer=self)
    
    而serializer的会调用父类BaseSerializer的data方法
    @property
        def data(self):
            if hasattr(self, 'initial_data') and not hasattr(self, '_validated_data'):
                msg = (
                    'When a serializer is passed a `data` keyword argument you '
                    'must call `.is_valid()` before attempting to access the '
                    'serialized `.data` representation.
    '
                    'You should either call `.is_valid()` first, '
                    'or access `.initial_data` instead.'
                )
                raise AssertionError(msg)
    
            if not hasattr(self, '_data'):
                if self.instance is not None and not getattr(self, '_errors', None):
                    self._data = self.to_representation(self.instance)
                elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None):
                    self._data = self.to_representation(self.validated_data)
                else:
                    self._data = self.get_initial()
            return self._data
    
    

    2,按运行的顺序,现在会运行self.to_representation方法,

    所以现在调用serializer里面的to_representation方法

        def to_representation(self, instance):
            """
            Object instance -> Dict of primitive datatypes.
            """
            ret = OrderedDict()
            fields = self._readable_fields             #获取我们所写的serializer下面的所有fields,  例: OrderedDict([('m1_overdue_rate', SerializerMethodField()),]
    
            for field in fields:
                try:
                    attribute = field.get_attribute(instance)
                except SkipField:
                    continue
    
                # We skip `to_representation` for `None` values so that fields do
                # not have to explicitly deal with that case.
                #
                # For related fields with `use_pk_only_optimization` we need to
                # resolve the pk value.
                check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
                if check_for_none is None:
                    ret[field.field_name] = None
                else:
                    ret[field.field_name] = field.to_representation(attribute)
    
            return ret

     待续

  • 相关阅读:
    WebAPI的文件上传与下载
    cefSharp框架中的C#方法和Web项目中的JS方法相互调用
    C# 引用类型的对象克隆(深拷贝)。
    C++模板特化
    一、JavaScript高级程序设计-----JavaScript简介
    二、C#图解教程第七章--类和继承
    C#IDIspose接口的使用
    CLR via C# 可空值类型
    WPF数据绑定
    计算机网路基础
  • 原文地址:https://www.cnblogs.com/52forjie/p/10110481.html
Copyright © 2011-2022 走看看