serializers序列化,反序列化,局部全局钩子

昨日回顾:
1 restful规范
-前后端分离
-前端一个项目,后端一个项目
-微服务
-单体应用
-一个一个服务
-集群和分布式
- 集群是分布在多台服务器,分布式就是将项目分成一个个服务,每个服务可以集群
1 通常用HTTPS协议
2 域名部署
-api.baidu.com
-www.baidu.com/api
3 版本
-www.baidu.com/api/v2
-版本号放在请求头中
4 路径都是名词(可以用复数)
5 根据不同的请求方式,执行不同操作
-delete请求表示删除资源
-patch
-post
什么是幂等性,put和patch请求是幂等性,post请求不是幂等性
6 请求地址中携带过滤条件
7 状态码
-{status:100,error:成功,data:[{},{},{}]}
8 错误信息
9 响应的数据格式:
-所有数据:列表
-删除数据:返回一个空:{status:100,error:删除成功,data:""}
-修改数据:{status:100,error:修改成功,data:{id:1,title:金瓶}}
10 返回的数据中携带连接
2 CBV执行流程(继承View)
-路由中配置 类名.as_view()----放了个函数的内存地址
-当请求来了:内存地址(request,其他参)
-内部又调用的dispatch方法,dispatch方法中通过反射,根据请求方式的不同,执行不同的方法
3 安装drf

4 drf执行流程,APIView,Request
-继承APIView(继承自view),重写了dispatch方法
-dispatch方法:1 request对象,被重新封装了,成了新的request 这个方法做的事:self.initialize_request(request, *args, **kwargs)
-self.initial(request, *args, **kwargs)
-认证,权限,频率
-Request类:drf写的类
-data: body体中的数据
-request._request:原来的request
-request.POST/method.... 重写了__getattr__方法
class BookSerializer(serializers.Serializer):
name=serializers.CharField(source=‘title’(对应原表里的title))#source三种用法
publish=serializers.CharField(source='publish.name')#可设置对应关系表李某一字段,还可以指定表模型的方法,#指定方法的时候,执行该方法,并将返回值付给xx这个变量

author=serializers.SerializerMethodField()
def get_autor(self,obj):
return
{'id':obj.author.pk,'name':obj.author.name}
    # 实例化一个作者的序列化类对象
# author_ser=AuthorSerializer(author_list,many=True)
#
# return author_ser.data
class BookSerializer(serializers.ModelSerializer):
class Meta:
model=models.Book
fields='___all__'
depth=1 #几层
可以写单个字段进行覆盖
def validate_name(self,value):
if value.startswith('sb'):
#不能让你过
raise ValidationError('书名不能以sb开头')
else:
return value
# def validate(self,a):
# # print(a)
# name=a.get('name')
# price=a.get('price')
# if name != price:
# raise ValidationError('错了')
# else:
# return a
# 指定要序列化的字段
# fields=['nid','name']
#序列化所有字段
fields='__all__'
#选择要排除的字段(注意,不能跟fields连用)
# exclude=['name','price']
#深度,官方建议最多写10,我个人建议最多写3
# depth=1
view视图函数层
#不使用序列化组件
# def get(self, request, *args, **kwargs):
# response = {'status': 100, 'msg': '获取成功'}
# book_list = models.Book.objects.all()
# book_ll=[{'id':book.pk,'name':book.name,'price':book.price} for book in book_list]
# # book_ll=[]
# # for book in book_list:
# # book_ll.append({'id':book.pk,'name':book.name})
# response['data']=book_ll
# # return JsonResponse(response,safe=False)
# # 以后推荐用这种,一定要注册一下rest_framework
# return Response(response)
class Books(APIView):
def get(self,request):
book_list=models.Book.objects.all()
response={'statue':1,'msg':'获取成功'}
response['data']=MySerializer.BookSerializer(book_list,many=True).data
return Response(response)

def post(self,request):
response = {'statue': 1, 'msg': '新增成功'}
try:
book=MySerializer.BookSerializer(data=request.data)
if book.is_valid():
book.save()
response['data'] = book.data
else:
response['msg']=book.errors

except Exception as e:
response['msg'] = e
return Response(response)

反序列化


多本书 many=Ture 单 many=False
class Book(APIView):
def get(self,request,id,*args,**kwargs):
book=models.Book.objects.filter(id=id).first()
response = {'statue': 1, 'msg': '获取成功'}
response['data']=MySerializer.BookSerializer(book,many=False).data
return Response(response)
def put(self,request,id):
book=models.Book.objects.filter(id=id).first()
response = {'statue': 1, 'msg': '修改成功'}
try:
book=MySerializer.BookSerializer(book,data=request.data)
if book.is_valid():
book.save()
response['data'] = book.data
else:
response['msg']=book.errors

except Exception :
response['msg'] = '错误'
return Response(response)
def delete(self,request,id):
response = {'statue': 1, 'msg': '删除成功'}
try:
models.Book.objects.filter(id=id).first().delete()
except Exception:
response['msg']='未知错误'
return Response(response)






















原文地址:https://www.cnblogs.com/wrqysrt/p/10601504.html