关于序列化器的使用和处理

关于普通序列化器和模型序列化器


1:普通序列化器

众所周知Response不能直接返回orm对象的,所以需要我们进行序列化操作,可以通过手动将其转为字典或JSON,也可以使用DRF所提供的序列化器

####下面的是代码模块

import re

from rest_framework import serializers
from rest_framework.exceptions import ValidationError

# 部门的序列化器
from users.models import Department, Duty, Staff


class DepartmentSer(serializers.Serializer):
    #read_only=True 只做序列化输出
    id = serializers.IntegerField(label='部门编号',read_only=True)
    #三种基本的校验约束 # max_length=(数字,数值) 最大长度   min_length= 最小长度   allow_null=True允许为空  trim_whitespace=True反序列的时候输入数据库去掉两旁空格
    name = serializers.CharField(label='部门名称',max_length=50,min_length=2,allow_null=True,trim_whitespace=True)
    #全局校验
    def validate(self,data):
        print('正在进行校验:',data)
        ...
        return data
    #校验不通过
    # raise ValidationError

    #重写create方法
    def create(self, validated_data):
        #保存数据  **就是把里面东西解出来
        dep = Department.objects.create(**validated_data)
        return dep

    #重写update方法
    def update(self, instance, validated_data):
        instance.name = validated_data['你要进行重编的字段名称'] ----列如我的是name,那就是['name'],还有另一种办法用的get,我现在用的是参考与-----地址在下面
        instance.save()
        return instance

##在编写代码的过成中你还可以进行一些校验,已达到对某些特殊字段进行一个约束的作用,一共有三种校验方式,全局>>列如我代码块里的   2:局部 推荐使用局部   3:在字段里对其进行限制,在字段外定义,字段里进行限制,类似于单个字段

def a(name):
    return name

# 职务类-
class DutySer(serializers.Serializer):
    id = serializers.IntegerField(label='职务编号',read_only=True)
    name = serializers.CharField(label='部门名称',max_length=50,min_length=2,allow_null=True,trim_whitespace=True,
                                 validators=[a,])

# validators=[a,] 指明字段 []里面写以什么开始  ----对于这个我也不是很了解 只能按照我自己想的跟大家说了  

但是普通序列化器有一个很大的不足之处,就是如果你的代码字段多了以后,工作量和代码量就会变的很大,这样对于我们出错的几率也会变的很大,并且有关于时间和有关于时间DateTimeField DateField 等字段类型的序列化直接通过JOSN也是不行的

2: 模型序列化器

刚刚讲了普通序列化器,对于模型类字段少的,还行,但是多的话,还是建议大家使用模型序列化器,模型类序列化器可以更加方便的进行字段映射以及内置方法的编写

其优点:

1:基于模型类自动生成的一些列字段

2:自动生成的系列字段,同时还包含unique max_length等属性校验

3:不需要在重写的createupdate方法

4:明天我在说吧

参考链接----如果你报错可以去参考一下序列化类用的serializer报错update() must be implemented_只因为你而温柔的博客-CSDN博客p序列化类用的serializer, 修改数据时报错update() must be implemented.源码解决方法重写序列化类里的update方法class ShopCartSerializer(serializers.Serializer):"""购物车序列化类"""# 因为我们模型类设置了unique_together 我们在这里用ModelSerializer# ...https://blog.csdn.net/zsx1314lovezyf/article/details/101364225

 普通序列化器的导入方式

from rest_framework import serializers

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ProtoBuf是一种数据序列化和反序列化的技术,它的全称是Protocol Buffers。ProtoBuf可以将结构化数据转换为二进制格式,以便在不同的系统之间进行高效的数据交换。使用ProtoBuf进行序列化和反序列化有以下几个优势: 1. 空间效率:ProtoBuf使用紧凑的二进制编码格式,可以大大减少数据的存储空间。相比于传统的文本格式如XML和JSON,ProtoBuf的数据大小通常要小得多。 2. 时间效率:ProtoBuf的解析和生成代码都是使用高效的机生成,因此在序列化和反序列化过程中可以获得更快的速度。特别是在处理大规模数据时,ProtoBuf的效率更加显著。 3. 可读性:虽然ProtoBuf的数据是以二进制形式存储的,但是它的定义文件是以文本形式进行编写的,具有良好的可读性和可维护性。开发人员可以通过阅读ProtoBuf定义文件了解数据结构的字段和类型。 在前后端交互中,ProtoBuf可以作为一种通用的数据交换格式。前端可以将数据序列化为ProtoBuf格式,然后发送给后端进行处理。后端可以将接收到的ProtoBuf数据反序列化为对象,然后进行相应的业务逻辑处理。 下面是使用ProtoBuf进行序列化和反序列化的示例代码: ```java // 创建一个user对象 User user = User.builder().id("1").age(20).name("张三").desc("programmer").build(); // 创建一个Group对象,将user放入group中 Group group = Group.builder().id("1").name("分组1").user(user).build(); // 使用ProtostuffUtils序列化 byte[] data = ProtostuffUtils.serialize(group); System.out.println("序列化后:" + Arrays.toString(data)); // 使用ProtostuffUtils反序列化 Group result = ProtostuffUtils.deserialize(data, Group.class); System.out.println("反序列化后:" + result.toString()); ``` 在上述代码中,首先创建了一个User对象和一个Group对象,然后使用ProtostuffUtils对Group对象进行序列化,将其转换为字节数组。接着使用ProtostuffUtils对字节数组进行反序列化,将其转换为Group对象。最后输出反序列化后的Group对象。 引用:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值