drf序列化
Posted yangyufeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了drf序列化相关的知识,希望对你有一定的参考价值。
1.rest-framework序列化之Serializer
rest-framework序列化之Serializer步骤 1. 创建一个类,继承Serializer 2. 在类中写要序列化的字段 ‘‘‘ class BookSerializer(serializers.Serializer): # 序列化表中的某几个字段 固定写法 nid = serializers.CharField() name = serializers.CharField() title = serializers.CharField(source=‘name‘) price = serializers.CharField() publish = serializers.CharField(source=‘publish.email‘) ‘‘‘ 3. 在View.py中使用 ‘‘‘ # 使用序列化 def get(self, request): response = {‘status‘: 100, ‘msg‘: ‘获取成功‘} book_list = Book.objects.all() # 实力化BookSerializer, 将要实力化的数据传入(Queryset对象) # 要是用序列化一定要加many=True book_ser = BookSerializer(book_list, many=True) response[‘data‘] = book_ser.data return Response(response) ‘‘‘
2. source的用法
1. 指定字段 2. 指定方法 3.深度查询(跨表)
3. rest-framework序列化之ModelSerializer
# 继承ModelSerializer,可以直接指定要序列化的表模型 1. 写一个类, 继承ModelSerializer 2. 在类内部写 class BookSerializer(serializers.ModelSerializer): class Meta: model = models.Book # 指定要序列化的字段 # fields=[‘nid‘,‘name‘] # __all__显示全部内容 field =‘__all__‘ # 筛选(注意,不能跟fields连用) exclude = [‘name‘, ‘price‘] # 深度 depth = 1 重写属性 publish字段,返回出版社的所有信息,包括id,name,email。。。。 #SerializerMethodField配合一个方法,方法的返回值会付给publish publish=serializers.SerializerMethodField() def get_publish(self,obj): # print(type(obj)) # print(obj) return {‘id‘:obj.publish.pk,‘name‘:obj.publish.name}
4. 序列化单条数据
book_ser=BookSerializer(instance=book,many=False)
5. 反序列化之局部和全局钩子(序列化的类一定是继承ModelSerializer的类)
def validate_name(self, value): if value.startswith(‘sb‘) raise ValidationError(‘书名不能以s开头) else: return value #全局钩子函数,对全局字段进行校验 def validate(self,atrr): # print(atrr) name=atrr.get(‘name‘) price=atrr.get(‘price‘) if name != price: raise ValidationError(‘错了‘) else: return a
以上是关于drf序列化的主要内容,如果未能解决你的问题,请参考以下文章
drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求解析渲染响应异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中(代码片