DRF框架之serializer序列化

序列化与反序列化

1.序列化

概念:将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将 django 中的模型类对象转换为json字符串,这个转换过程称之为序列化
序列化时机:当需要给前端响应模型数据时,需要将模型数据序列化成前端需要的格式

2.反序列化

概念:将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为 django 中的模型类对象,这个过程称之为反序列化
反序列化时机:当需要将用户发送的数据存储到数据库之前,需要使用反序列化

3.开发Restful接口

视图中做的最主要的三件事:

  • 将请求的数据(如:Json格式)转换为模型类对象(反序列化)
  • 操作数据库
  • 将模型类对象转换为响应的数据(如:Json格式)(序列化)

在视图中需要做的最核心的事:

  • 将数据库数据序列化为前端所需要的格式,并返回
  • 将前端发送的数据反序列化为模型类对象,并保存到数据库中

常用序列化器类

1.serializers.Serializer

应用下先创建一个名为 serializers.py 的模块,在该模块下需要引入 serializers 模块,并创建序列化器类 ProjectsSerializer 继承 serializers.Serializer 父类

from rest_framework import serializers
class ProjectSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=200, label="项目名称", help_text='项目名称')
    leader = serializers.CharField(max_length=50, label="项目负责人", help_text='项目负责人')
    programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
    tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")
字段说明
  • max_length:最大长度:在反序列化时进行输入最大长度校验
  • min_length :最小长度:在反序列化时进行输入最小长度校验
  • allow_blank:是否允许为空:在反序列化时允许传空白字符串,默认不允许
  • max_value:最大值:在反序列化时进行输入最大值校验
  • min_value:最小值:在反序列化时进行输入最小值校验
  • read_only:表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认 False
  • write_only:表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认 False
  • required:表明该字段在反序列化时必须输入,序列化时必须输出,默认 True
  • default:反序列化时使用的默认值,如果不指明,在传递时默认值为 0
  • allow_null:表明该字段是否允许传入 None,默认 False
  • validators :该字段使用的验证器
  • error_messages:包含错误编号与错误信息的字典
  • label:用于HTML展示API页面时,显示的字段名称,相当于模型类字段的 verbose_name 属性
  • help_text:用于HTML展示API页面时,显示的字段帮助提示信息
序列化模型类对象

在视图类模块下,返回的为模型类对象时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给 instance 变量,并返回一个序列化器类对象
  • 调用序列化器类对象的 data 属性后传入 JsonResponsereturn
obj = Projects.objects.get(id__exact=pk)
serializer_obj = ProjectSerializer(instance=obj)
return JsonResponse(serializer_obj.data)
序列化查询集

在视图类模块下,返回的为查询集时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给 instance 变量,并且设置 many=True,并返回一个序列化器类对象
  • 调用序列化器类对象的 data 属性后传入 JsonResponse ,设置 safe=False ,并 return
自定义create和update方法
def create(self, validated_data):
    # validated_data参数为校验通过之后的数据
    # 必须将创建成功的模型类对象返回
    obj = Projects.objects.create(**validated_data)
    return obj

def update(self, instance, validated_data):
    # instance为待更新的模型类对象
    # validated_data参数为校验通过之后的数据
    # 必须将更新成功的模型类对象返回
    instance.name = validated_data.get('name') or instance.name
    instance.leader = validated_data.get('leader') or instance.leader
    instance.tester = validated_data.get('tester') or instance.tester
    instance.programmer = validated_data.get('programmer') or instance.programmer
    instance.desc = validated_data.get('desc') or instance.desc
    instance.save()
    return instance

2.serializers.ModelSerializer

应用下先创建一个名为 serializers.py 的模块,在该模块下需要引入 serializers 模块,并创建序列化器类 ProjectsModelSerializer 继承 serializers.ModelSerializer 父类

特性
  • filed 字段可以不需要自己写,与模型一一对应

  • ModelSerializer 中定义了与本来需要序列化字段同名的字段,会覆盖原来的模型类映射的字段

  • 简单的实现了 createupdate 方法,可根据需求重写。调用父类的 creatupdate 方法时,validated_data 不需要解包

    # update
    super().update(instance, validated_data)
    # create
    super().create(validated_data)
    
自定义Meta参数属性
  • mode关联的模型类

  • fields

    • 使用 fields 来明确字段, 可以写明具体哪些字段
    • 也可以写 __all__,所有字段都生成序列化规则
  • exclude:可以明确排除掉哪些字段

  • read_only_fields:指明只读字段,即仅用于序列化输出的字段

  • extra_kwargs:为 ModelSerializer 添加或修改原有的选项参数,来定制某些字段(嵌套字典)

from rest_framework import serializers
from App.models import Projects

class ProjectModelSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(write_only=True)
    
    class Meta:
        # 需要在Meta内部类这两个指定model类属性:需要按照哪一个模型类来创建
        # fields类属性来指定模型类中哪些字段需要输入或输出
        model = Projects
        fields = '__all__'
        exclude = ('id', 'desc', 'create_time')
        extra_kwargs = {
            'programmer': {
                'label': '研发人员',
                'write_only': True,
            }
        }
### Django REST framework 中序列化与反序列化的用法及区别 #### 一、序列化的作用和实现 序列化是指将复杂的 Python 对象转换成可以轻松传输或存储的数据格式,比如 JSON 或 XML。在 DRF 中,`Serializer` 类用于处理这一过程,它不仅能够把对象转为原生的 Python 数据类型以便进一步渲染为 JSON 等格式,还支持数据验证。 ```python from rest_framework import serializers from .models import Person class PersonSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=100) age = serializers.IntegerField() def create(self, validated_data): return Person.objects.create(**validated_data) def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.age = validated_data.get('age', instance.age) instance.save() return instance ``` 此代码展示了如何定义一个简单的 `PersonSerializer` 来执行基本的对象创建和更新操作[^1]。 #### 二、反序列化的过程 反序列化则是指接收客户端发送过来的数据(通常是通过 HTTP 请求),将其解析并转化为内部表示形式——即数据库中的记录或其他持久化结构。为了确保安全性和准确性,在这个过程中会对输入的数据进行严格的校验。 当接收到 POST 或 PUT 请求时,DRF 将自动调用对应的 Serializer 方法来进行必要的转换: - **POST**: 调用 `create()` 创建新实例; - **PUT/PATCH**: 则会触发 `update()` 修改现有条目; 这两个函数都需要传入经过验证后的字典参数 `validated_data`,该字典包含了所有要保存到模型里的字段值[^4]。 #### 三、两者之间的主要差异 | 特征 | 序列化 | 反序列化 | |-------------|-------------------------------------------|------------------------------------------| | 方向 | 把Python对象变成易于交换的形式 | 接收外部提交的信息,并映射回应用程序内的实体 | | 主要用途 | API响应输出 | 处理来自用户的表单提交或者其他HTTP请求体的内容 | | 关键方法 | `.data`, 返回可被渲染引擎使用的原始数据 | `.is_valid()`, 验证用户提供的信息是否合法合规 | 上述表格总结了序列化与反序列化的主要不同之处[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值