首先,在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本机数据类型(字典,列表)
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