DRF框架之Serializer序列化器的反序列化操作

我们首先要明确什么是反序列化操作

反序列化操作:JOSN数据 --> 字典数据 --> 验证通过的字典数据 --> 模型数据

我们在进行反序列化操作时,首先要保证就是要拿到的字典数据一定要通过认证

1、定义一个序列化器
from rest_framework import serializer
class UserSerializer(serializers.Serializer):
    '''定义用户Serializer序列化器'''
    # 这里的字段需要和模型类中的字段名、字段类型、约束一致
    name = serializers.CharField(max_length=20)  # 姓名
    age = serializers.IntegerField()   # 年龄
    address = serializers.CharField(max_length=20)  # 地址
2、准备JSON数据或字典数据
data = {'name':'某XX','age':19,'address':'河南'}
3、验证字典数据

我们使用序列化器对象点出is_valid()方法进行验证。验证成功返回True,否则返回False

data = {'name':'某XX','age':19,'address':'河南'}
user_ser = UserSerializer(data=data)
if user_ser.is_valid():   # 如果验证成功,则保存数据返回
    user_ser.save()
    return Response({'msg':'OK','code':200})
else:    # 如果验证失败,则返回错误errors
    return Response({'error': user_ser.errors})
4、对单一字段进行验证

我们需要在序列化器类中定义一个名字wei(validata_字段名) 的方法,来补充验证逻辑

def validate_name(self, attrs):
    '''
    对name字段进行验补充
    :param value: 前段传递的name数据
    :return: 验证成功:返回value;验证失败:返回错误信息
    '''   
    if attrs != 'peter':
        raise serializer.ValidationError('不是peter本人')
  	return attrs
5、对所有字段进行验证
def validate(self, attrs):
        '''
        对多个字段进行验证
        :param attrs: 前段传递的字典数据
        :return: 验证成功:返回attrs;验证失败:返回错误信息
        '''
       	name = attrs['name']
        print(name)
        if name != 'peter':
            # 失败
            raise serializer.ValidationError('不是peter本人')
        # 成功
  		return attrs
6、添加数据,重写create方法
def create(self,validated_data):
     '''
        序列化器进行新增数据的方法
        :param validated_data: 通过验证的字典数据
        :return:根据RESTful设计方式,需要将添加的数据返回
      '''
    return User.objects.create(**validated_data)

7、修改数据,需要在序列化器类中定义一个update()方法

 def update(self, instance, validated_data):
        '''
        序列化器进行修改数据的方法
        :param instance: 需要修改的模型对象
        :param validated_data: 前端传递的字典数据
        :return: 根据RESTful设计方式,需要将修改的数据返回
        '''
        
        # 新值覆盖旧值
        instance.字段名 = validated_data.get(字段名)
        instance.save()
        return instance
原文地址:https://www.cnblogs.com/sleepimg/p/13886488.html