当你发现自己的才华撑不起野心时,就请安静下来学习吧。

Personal site

↑点击传送

序列化组件

序列化组件

序列化组件介绍

1 序列化,序列化器会把模型类对象转换成字典,经过response变成json字符串
2 反序列化,把客户端发送过来的数据,经过request变成字典,序列化器可以把字典转成模型类对象
3 反序列化,完成数据校检功能

简单使用

1 写一个序列化类,继承Serializer
2 在类中写要序列化的字段
3 在视图中使用,导入序列化类,实例化得到序列化的对象,把序列化对象传入
4 序列化类的对象.data是一个字典
5 把字典返回,使用rest_framework的Response,或者JsonResponse
class BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    price = serializers.CharField()
    author = serializers.CharField()
    publish = serializers.CharField()
class BookAPIView(APIView):
    def get(self,request):
        book = Book.objects.all()
        boo_ser = BookSerializer(Book)#实例化得到序列化对象,把序列化对象传入
        return Response(boo_ser.data)#序列化类的对象.data是一个字典,用rest_framework的Response返回,或JsonResponse返回

序列化的字段类型

#常用的字段
	CharField,必须参数max_length
	IntegerField,
	DateField,
	DecimalField,参数ecimal_places=2#表示保留小数2位,max_digits=5#整数5位
	BooleanField,#布尔类型
	NullBooleanField,#可以为空的布尔类型
	DateTimeField,参数auto_now_add=True##创建数据时自动把当前时间写入该字段auto_now=True#更新数据会更新该时间,只能同时存在一个
    ImageField(upload_to='icon',default='media/icon/default.png')#保存路径icon,默认的头像位置media/icon/default.png
#字段参数
max_length	最大长度
min_lenght	最小长度
allow_blank	是否允许为空
trim_whitespace	是否截断空白字符
max_value	最小值
min_value	最大值

#通用参数
read_only	表明该字段仅用于序列化输出,默认False
write_only	表明该字段仅用于反序列化输入,默认False
required	表明该字段在反序列化时必须输入,默认True
default	反序列化时使用的默认值
allow_null	表明该字段是否允许传入None,默认False
validators	该字段使用的验证器
error_messages	包含错误编号与错误信息的字典
label	用于HTML展示API页面时,显示的字段名称
help_text	用于HTML展示API页面时,显示的字段帮助提示信息

序列化组件完整使用

Serializers
###ser.py
#其他的校检方式,写一个函数,不要写在序列化类里,配置方式
# 在author=serializers.CharField(validators=[check_author])
def check_author(data):
    if data.startawith('sb') or data.endswith('sb'):
        raise ValidationError('author不能包含sb字符')
    else:
        return data

class BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    price = serializers.CharField()
    author = serializers.CharField(validators=[check_author])

    # 局部钩子,validate_需要校检的字段名
    def validate_price(self, data):
        print(type(data), data)
        if float(data) <= 1:
            raise ValidationError('价格太低了')  # 报校检错误
        else:
            return float(data)

    # 全局钩子,校检更多的字段
    def validate(self, attrs, ):
        author = attrs.get('author')
        # price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
        name = attrs.get('name')
        if author.startswith('sb') or author.endswith('sb'):
            raise ValidationError('author不能包含sb字符')
        if name.startswith('sb') or name.endswith('sb'):
            raise ValidationError('name不能包含sb字符')
        else:
            return attrs
ModelSerializer、extra_kwargs(额外的键值)
###ModelSerializer
from rest_framework import serializers
from rest_framework.exceptions import ValidationError

from app01.models import Book


# ModelSerializer比Serializers多了update、create方法
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book#序列化的模型类
        fields = '__all__'#‘__all__’所有,也可以自己指定('name','price')
        extra_kwargs = {  # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
            'id': {'read_only': True},
        } 
    #局部钩子,validate_需要校检的字段名
    def validate_price(self,data):
        print(type(data),data)
        if float(data) <= 1:
            raise ValidationError('价格太低了')#报校检错误
        else:
            return float(data)
    #全局钩子,校检更多的字段
    def validate(self, attrs,):
        author = attrs.get('author')
        # price = attrs.get('price')#同一个字段不能局部跟全局都校检,会报错
        name = attrs.get('name')
        if author.startswith('sb') or author.endswith('sb'):
            raise ValidationError('author不能包含sb字符')
        if name.startswith('sb') or name.endswith('sb'):
            raise ValidationError('name不能包含sb字符')
        else:
            return attrs
###extra_kwargs(额外的键值)
    class Meta:
        model = Book
        fields = '__all__'
        extra_kwargs = {  # 类似于这种形式name=serializers.CharField(max_length=16,min_length=4)
            'id': {'read_only': True},
        }
read_only	表明该字段仅由于序列化输出
write_only	表明该字段仅由于反序列化输入
#了解
required	表明该字段在序列化时必须输入
default		反序列化时使用的默认值
allow_null	是否允许传入none,默认False
vilidators	该字段使用的验证器
error_messages	包含错误编码与错误信息的字典
many=True
#获取所有,序列化多条数据,使用many=True
    books = Book.objects.all()
    book_ser=BookModelSerializer(books,many=True)
source、SerializerMethodField()的使用
#source
	1 可以改字段名字,改成aaa,前端获取的就是aaa而不是数据库中真是的字段名
	aaa=serializers.CharField(source='name')
	2 可以跨表
	aaa=serializers.CharField(source='publish.name')
	3 可以执行方法,test是模型类Book中的方法
	aaa=serializers.CharField(source='test')
#SerializerMethodField(),它需要有个配套方法,get_字段名,返回值就是要那个字段的值
	def get_author(self,instance):
    	authors = instance.authors.all()
    	list1=[]
    	for author in authors:
			list.append({'name':author.name,'age':author.age})
		return list1
自己封装Response对象
class MyResponse():
    def __init__(self):
        self.status = 100
        self.msg = '成功'

    @property
    def get_dict(self):
        return self.__dict__
posted @ 2020-07-21 16:19  Joab-0429  阅读(167)  评论(0编辑  收藏  举报