文章目录
序列化
1.1声明序列化器
from rest_framework import serializers
class xxxSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
1.2常用field类
核心参数
常用字段
1.3 创建Serializer对象
定义好Serializer类后,就可以创建Serializer对象了。Serializer的构造方法为:
Serializer(instance=None, data=empty, **kwarg)
说明:
1> 用于序列化时,将模型类对象传入instance参数
2>用于反序列化时,将要被反序列化的数据传入data参数
3>除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如
serializer = UserSerializer(User, context={'request': request})
通过context参数附加的数据,还可以通过Serializer对象的context属性获取
data = User.objects.all()
serializer = UserSerializer(instance=data,many=True)
如果要被序列化是包含多条数据的查询集QuerySet,可以通过添加mant=True参数补充说明
1.4 ModelSerializer
ModelSerializer类能够让你自动创建一个具有模型中相应字段的Serializer类。这个ModelSerializer类和常规的Serializer类一样,不同的是:
1>它根据模型自动生成一组字段
2>他自动生成序列化器的验证器
3>它默认简单实现了.create()方法和.update()方法
# 定义
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date')
# 使用exclude可以明确排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
exclude = ('image',)
# 指明只读字段:可以通过read_only_fields指明只读字段,即仅用于序列化输出的字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date'҅ 'bread', 'bcomment')
read_only_fields = ('id', 'bread', 'bcomment')
# 添加额外参数:我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date'҅ 'bread', 'bcomment')
extra_kwargs = {
'bread': {'min_value': 0,
'required': True},
'bcomment': {'min_value': 0, 'required': True},
}
反向序列化
# 反向序列化: 将前端传过来的数据生成对象,可以保存到数据库
book = {'btitle': '庆余年', 'bpub_date': '2020-3-10',
'bread': 10, 'bcomment': 30, 'bimage': 'static/1.jpg'}
bs = BookSerializer(data=book)
# 验证
if bs.is_valid():
# 保存到数据
bs.save()
print(bs.data)
return Response({'code': 2, 'msg': '保存成功'})
else:
print(bs.errors)
return Response({'code': 1, 'msg': bs.errors})