drf_day02

序列化组件的介绍

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

简单实用

1	写一个序列化的类,继承Serializer
2	在类中写要序列化的字段,想序列化哪个字段,就在类中写哪个字段
3	在视图类中使用, 导入--》实例化得到序列化类的对象, 把要序列化的对象传入
4	序列化类的对象.data	是一个字典
5	把字典返回, 如果不使用rest_framework提供的Response,就得使用JsonResponse

序列化类的字段类型

有很多,不需要都记住 主要是为了跟django的字段类型对上号
只需要记住:CharField, IntegerField, DateField...

序列化组件修改数据

1	写一个序列化的类, 继承Serializer
2	在类中写要反序列化的字段, 想反序列化哪个字段, 就在类中写哪个字段,字段的属性(max_length..)
		max_length	最大长度
		min_lenght	最小长度
		allow_blank	是否允许为空
		trim_whitespace	是否截断空白字符
		max_value	最小值
		min_value	最大值

3	在视图类中使用,导入==》实例化得到序列化类的对象,把要修改的对象传入,修改的数据传入
		boo_ser = BookSerializer(instance=book,data=request.data)

4	数据校验	if 	boo_ser.is_vaild()

5	如果校验通过,就保存
		boo_ser.save()	# 这里直接保存会报错 ,因为继承了父类的save方法 这里规定了就要重写save类里面的update方法 

6	如果不通过 逻辑自己写

7	如果字段的校验规则不够,可以写钩子函数(局部和全局)
		def validate_price(self, data):
	        # 如果价格小于10, 校验不通过
	        if float(data)>10:
	            return data
	        else:
	            # 校验失败,抛异常
	            raise ValidationError('价格太低,保存失败')

		 # 全局钩子
	    def validate(self, attrs):
	        print(attrs)
	        author = attrs.get('author')
	        publish = attrs.get('publish')
	        if author == publish:
	            raise ValidationError('作者名字和出版社名称不能一致')
	        else:
	            return attrs 

8	还有第三种校验  使用字段
		def check_author(data):
		    if data.startwith('sb'):
		        raise ValidationError('作者名字不能以sb开始')
		    else:
		        return data

		author = serializers.CharField(validators=[check_author])   # validators=[] 用来存放函数内存地址

read_only 和write_only

read_only	表名该字段仅用于序列化输出, 默认False,如果设置成True	Postman中可以看到该字段,修改时,不需要传该字段
write_only	表明该字段仅用于反序列化输入, 默认False,如果设置成True	Postman中get看不到该字段 ,修改时要传该字段

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

查询所有

# views.py

 class BooksView(APIView):
    def get(self, request):
        response_msg = {'status': 1001, 'msg': '成功'}
        books = Book.objects.all()
        book_ser = BookSerializer(books, many=True)     # 序列化多条 如果序列化一条 不需要写
        response_msg['data'] = book_ser.data
        return Response(response_msg)

# urls.py
	path('books/', views.BooksView.as_view()),

新增数据

# views.py
 
 class BooksView(APIView):
    def post(self, request):
        response_msg = {'status': 1001, 'msg': '成功'}
        # 修改时才有instance, 新增没有  只有data
        book_ser = BookSerializer(data=request.data)
        # 校验数据
        if book_ser.is_valid():
            book_ser.save()
            response_msg['data'] = book_ser.data
        else:
            response_msg['status'] = 1002
            response_msg['msg'] = '数据校验失败'
            response_msg['data'] = book_ser.errors
        return Response(response_msg)

# ser.py	新增数据需要在ser.py中重写create方法
	     def create(self, validated_data):
	        instance = Book.objects.create(**validated_data)
	        return instance

# urls.py
	path('books/', views.BooksView.as_view()),

删除一个数据

 # views.py
 	
 	 class BooksView(APIView):
 	    def delete(self,request,pk):
	        res = Book.objects.filter(pk=pk).delete()
	        return Response({'status': 1001, 'msg': '删除成功'})

# urls.py
	re_path('books/(?P<pk>\d+)', views.BookView.as_view()),

模型类序列化器

class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book    # 对应上models.py中的模型
        fields = '__all__'
        # fields = ('name', 'price', 'id', 'author')  # 只序列化指定字段
        # exclude = ('name')        # 除了name字段不序列化 其它都序列化
        read_only_fields=('price')

# 其它使用一模一样
# 不需要重写create和updata方法了

Serializer高级用法

	source的使用
		1	可以改字段名字	xxx = serializers.CharField(source='title')
		2	可以.跨表 publish=serializers.CharField(source='publish.email')
		3	可以执行方 pub_date=serializers.CharField(source='test')	test时Book表模型中的方法

	SerializerMethodField()的使用
		1	它需要有个配套的方法, 方法名叫get_字段名, 返回值就是要显示的东西
		authors = serializers.SerializerMethodField()	# 它需有个配套的方法, 方法名叫get_字段名,返回值就是要显示的东西
		def get_authors(self, instance):
		authors = instance.authors.all()	# 取出所有作者
		ll = []
		for author in authors:
			ll.append({'name':author.name, 'age':author.age}_
		return ll

补充

补充自己封装 接口的Response对象

class mymessage:
    def __init__(self):
        self.status = 1001
        self.msg = '成功'
    @property
    def get_dict(self):
        print(self.__dict__)            # self.__dict__包含该对象的所有属性


if __name__ == '__main__':
    res = mymessage()
    res.status = 101
    res.msg = '查询失败'
    print(res.get_dict)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值