过滤组件、排序组件、全局异常处理、自己封装的response对象
过滤组件
查询所有才涉及到过滤,其他接口都不需要
restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤
创新互联服务项目包括海沧网站建设、海沧网站制作、海沧网页制作以及海沧网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,海沧网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到海沧省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
内置过滤类
使用内置过滤类的步骤
from rest_framework.filters import OrderingFilter,SearchFilter
必须是继承GenericAPIView+ListModelMixin的之类视图上,必须是查询所有的视图
1.配置过滤类
filter_backends=[SearchFilter,]
2.配置过滤类的字段
search_fields = ['name', ]
3.支持前端的访问形式
http://127.0.0.1:8000/books/?search=三 # 只要name中或publish中有三都能搜出来
内置过滤类只能通过search写条件,如果配置了多个过滤字段,是或者的条件
采用第三方过滤组件
#1 安装:pip3 install django-filter
#2 注册,在app中注册django-filter
#3 全局配,或者局部配
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
#4 视图类(局部配)
from django_filters.rest_framework import DjangoFilterBackend
class BookView(ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ('name',) #配置可以按照哪个字段来过滤,可以跨表过滤,意思是括号里的字段可以是外键字段
自定义过滤器
区间过滤
1.新建一个filters.py文件,在文件内自定义一个过滤类
暂略有点问题
### 排序组件
**排序功能只针对于所有接口,继承了GenericAPIView的视图类,只要加入,俩个类属性就可以了**
from rest_framework.filters import OrderingFilter
查询所有,按照价格排序,必须继承GenericAPIView及其子类
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [OrderingFilter, ]
ordering_fields = ['price',]
访问地址:
http://127.0.0.1:8000/books/?ordering=-price # 按照price降序
http://127.0.0.1:8000/books/?ordering=price # 按照price升序
http://127.0.0.1:8000/books/?ordering=price,id # 先按价格升序排,价格一样再按id升序排
注意:
ordering后面跟的必须要在ordering_fields = ['price','id']先注册好
![image](https://img2022.cnblogs.com/blog///--.png)
### 全局异常处理
在rest_framework的中,继承了apiview以及其子类的视图函数,在出现错误之后,会走dispatch方法里的self.handle_exception方法
![image](https://img2022.cnblogs.com/blog///--.png)
![image](https://img2022.cnblogs.com/blog///--.png)
我们可以对于未做处理的错误信息,可以自定义返回给前端的信息格式,在py文件中重写异常处理的方法,并在setting里配置成我们自己写的异常处理方法!
自定义异常方法,替换掉全局
写一个方法
自定义异常处理的方法
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def my_exception_handler(exc, context):
response=exception_handler(exc, context)
# 两种情况,一个是None,drf没有处理
#response对象,django处理了,但是处理的不符合咱们的要求
# print(type(exc))
if not response:
if isinstance(exc, ZeroDivisionError):
return Response(data={'status': 777, 'msg': "除以0的错误" + str(exc)}, status=status.HTTP_400_BAD_REQUEST)
return Response(data={'status':999,'msg':str(exc)},status=status.HTTP_400_BAD_REQUEST)
else:
# return response
return Response(data={'status':888,'msg':response.data.get('detail')},status=status.HTTP_400_BAD_REQUEST)
全局配置setting.py
'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',
### 自己封装的response对象
以后都用自己封装的
class APIResponse(Response):
def init(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs):
dic = {'code': code, 'msg': msg}
if data:
dic = {'code': code, 'msg': msg,'data':data}
dic.update(kwargs)
super().init(data=dic, status=status,headers=headers)
使用
return APIResponse(data={"name":'lqz'},token='dsafsdfa',aa='dsafdsafasfdee')
return APIResponse(data={"name":'lqz'})
return APIResponse(code='101',msg='错误',data={"name":'lqz'},token='dsafsdfa',aa='dsafdsafasfdee',header={})
网页标题:过滤组件、排序组件、全局异常处理、自己封装的response对象
当前路径:http://azwzsj.com/article/dsogcde.html