rest_framework框架入门(二)

Serializers类

声明表单

首先,在models.py文件下创建一个模型:

class Book(models.Model):
    name = models.CharField(max_length=11)
    price = models.IntegerField()

声明序列化程序

声明序列化程序看起来与声明表单非常相似:

# 序列化就是数据库把数据发给前端显示
# 反序列化是从前端 获取数据 存到数据库

class BookSerializer(serializers.Serializer):
    name = serializers.CharField(label='名字', max_length=11)  # label 标签
    price = serializers.IntegerField(label='价格', required=True)  # required= True表示一定要接收数据

序列化对象

obj = Book.objects.all()
ser = BookSerializer(obj, many=True)   # obj 是对象列表,里面有多个对象,所以这里就要添加many=True
ser.data  # python本机数据类型(字典,列表)

效果图:
在这里插入图片描述
接着为了完成序列化过程将数据渲染到json。

from rest_framework.renderers import JSONRenderer
json_data = JSONRenderer().render(ser.data)
json_data

代码图:
在这里插入图片描述

反序列化对象

反序列化是类似的,先把json类型数据转换成python本机数据类型

 import io
 from rest_framework.parsers import JSONParser
 stream = io.BytesIO(json_data)
 data = JSONParser().parse(stream)

效果图:
在这里插入图片描述

然后,我们将这些本机数据类型还原为经过验证的数据字典

ser1 = BookSerializer(data=data, many=True)
ser1.is_valid()   # 校验数据
ser1.validated_data

效果图:

在这里插入图片描述

保存实例

如果是Django模型,然后想把验证后的数据保存到数据库。
例如,Book是Django模型,下面代码为:

class BookSerializer(serializers.Serializer):
    name = serializers.CharField(label='名字', max_length=11)
    price = serializers.IntegerField(label='价格', required=True)

    def create(self, validated_data):
        return Book.objects.create(**validated_data)
        
    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.price = validated_data.get('price', instance.price)
        instance.save()
        return instance

验证

在反序列化数据时,一定需要is_valid()在尝试访问经过验证的数据之前调用,或者保存对象实例。

ser1 = BookSerializer(data=data, many=True)
ser1.is_valid()   # 校验数据

如果 ser1.is_valid() 返回的是False,可以通过.errors属性来显示错误信息。

还可以通过下面的方法显示无效数据的异常:

ser1 = BookSerializer(data=data, many=True)
ser1.is_valid(raise_exception=True)   # 校验数据,如果错误则自动返回错误信息

字段级验证

要执行需要访问单个字段的时候的验证,例子如下:

from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    '''主要是POST请求,来调用create'''
    name = serializers.CharField(label='名字', max_length=11)
    price = serializers.IntegerField(label='价格', required=True)

    def create(self, validated_data):
        return Book.objects.create(**validated_data)

    def validate_name(self, value):
        if len(value)>9:
            raise serializers.ValidationError("名字的长度不能大于9")
        return value

对象级验证

要执行需要访问多个字段的时候的验证,例子如下:

from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    '''主要是POST请求,来调用create'''
    name = serializers.CharField(label='名字', max_length=11)
    price = serializers.IntegerField(label='价格', required=True)

    def create(self, validated_data):
        return Book.objects.create(**validated_data)

    def validate(self, attrs):
        name = attrs['name']
        price = attrs['price']
        if name.isnumeric():
            raise serializers.ValidationError('名字不能有数字')
        if price > 250:
            raise serializers.ValidationError('价格不能太贵')
        return attrs

猜你喜欢

转载自blog.csdn.net/dakengbi/article/details/91046380