1. 源码分析 注意:以下代码片段为方便理解已进行简化,只保留了与序列化功能相关的代码 序列化的源码中涉及到了元类的概念,我在这里简单说明一下:元类(metaclass)是一个高级概念,用于定义类的创建行为。简单来说,元类是创建类的类,它决定了类的创建方式和行为。 在 Python 中一切皆为对象,
以下是对Python中序列化功能的源码分析。在序列化的源码中,涉及到了元类的概念。元类是一个高级概念,用于定义类的创建行为。简单来说,元类是创建类的类,它决定了类的创建方式和行为。在Python中,一切皆为对象,包括类。每个类都有一个元类,它定义了如何创建这个类。通常情况下Python会使用默认的元类type来创建类。但是,当需要对类的创建过程进行自定义时,就可以使用元类。
举例来说,可以定义一个自定义的元类Mytype,对类的创建过程进行操作。在使用自定义元类时,需要在类的定义中指定metaclass参数为自定义的元类。
另外,需要注意的是,如果指定了元类metaclass,则其子类默认会使用该元类来创建类。
Serializers组件主要有两个功能:序列化和数据校验。首先,定义一个序列化类DepartSerializer,其中包含了内置校验和字段定义。查看Serializer的父类,可知其是通过SerializerMetaclass元类创建的。SerializerMetaclass元类的作用是为类中增加_declared_fields属性,其中封装了所有的Field字段名及对应的对象。
在序列化流程中,通过serializer.data触发序列化流程。BaseSerializer的data方法源码中执行了to_representation方法获取序列化数据。to_representation方法是序列化的核心,它循环字段对象列表,并执行get_attribute方法获取对应的值,然后执行to_representation转换格式,并将所有数据封装到ret字典中。
数据校验部分使用is_valid方法校验数据,获取_errors数据。在执行该函数的过程中,触发了run_validation方法。run_validation方法是Serializer类下的方法,在to_internal_value方法中调用字段内置校验,并执行钩子函数。
另外,可以自定义钩子,让某字段既能支持前端传入,又能自定义序列化返回的值。在调用ser.data开始序列化后的to_representation方法中判断有无自定义格式的钩子,如果有则替换掉该字段对象的值。如果其他类中也需要使用该重写方法,可将该重新方法封装成类,其他类中继承该类后,即可不用每次都重写to_representation方法。
小编推荐阅读