drf源码_序列化源码

本文详细介绍了DRF(Django Rest Framework)序列化过程,包括实例化字段对象、序列化类创建、_declared_fields、创建序列化类对象以及序列化当前类的步骤。在实例化字段对象时,会维护一个计数器以确保顺序执行。序列化类由SerializerMetaclass创建,并在创建后在类中添加_declared_fields字段,用于存储所有字段。在视图中,通过创建序列化类对象并调用data属性来触发序列化过程,该过程涉及与数据库字段匹配、获取所有Fields并封装成字典。
摘要由CSDN通过智能技术生成

1、实例化字段对象

在创建类的时候,类里面定义的 类属性 和 方法是要比 类先创造的,因为如果我们用type()
这种方式创建类的时候,类属性和方法是要当作参数传给type的,所以 创建类的时候 类属性
和方法是先有的,然后再创建类

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from api import models

创建InfoSerializer之前,先实例化下面各个字段
class InfoSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    title = serializers.CharField()
    order = serializers.IntegerField()

对于上述代码,在类InfoSerializer创建之前,其内部id、title、order字段会先进行实例化对象。
而这些IntegerFieldCharField等字段的继承关系如下:

class Field:
    _creation_counter = 0
    
class IntegerField(Field):
    pass

class CharField(Field):
    pass

class DateTimeField(Field):
    pass

IntegerFieldCharField等字段实例化时,内部会维护一个计数器,来表示实例化的先后顺序。比如密码确认,有两个密码,第一次输入密码,第二次确认密码,这个一定是有先后顺序的,所以当有的场景需要按先后顺序执行Field 维护_creation_counter 就有必要了

class Field:
    _creation_counter = 0
	def __init__(self, *, read_only=False...):
        self._creation_counter = Field._creation_counter
        Field._creation_counter += 1
        
class IntegerField(Field):
	def __init__(self, **kwargs):
        ...
        super().__init__(**kwargs)

class CharField(Field):
	def __init__(self, **kwargs):
        ...
        super().__init__(**kwargs)


from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from api import models


class InfoSerializer(serializers.Serializer):
    按照如下顺序实例化,_creation_counter 也依次递增,由_creation_counter
    便可以决定以后的执行顺序
    id = serializers.IntegerField()  # 对象,内部_creation_counter=0
    title = serializers.CharField()  # 对象,内部_creation_counter=1
    order = serializers.IntegerField # 对象,内部_creation_counter=2

注意:后续会通过这个计数器排序,以此来实现字段的先后执行。

2、序列化类的创建

如果父类指定了由特定的metaclass创建类,那么子类继承父类的时候,子类也是由父类的元类
创建,我们创建序列化类时候,会继承Serializer 或者 ModelSerializer 而 ModelSerializer
也是继承 Serializer,Serializer是由 SerializerMetaclass 元类创建类,所以序列化类也是由
SerializerMetaclass 创建的
创建序列化类时,首先走 SerializerMetaclass的 new 方法

class SerializerMetaclass(type):
    # cls是指 SerializerMetaclass本身类(猜测,后面还需要确认)
    # name 要创建类的类名
    # bases  要创建类的父类
    # attrs 类属性
	def __new__(cls, name, bases, attrs):
        attrs['_declared_fields'] = cls._get_declared_fields(bases, attrs)
        return super().__new__(cls, name, bases, attrs)

class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
	...

class ModelSerializer(Serializer):
	...
    
class RoleSerializer(serializers.ModelSerializer):
    gender = serializers.CharField(source="get_gender_display")
    class Meta:
        model = models.Role
        fields = ["id", 'title',"gender"
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值