成都网站建设设计

将想法与焦点和您一起共享

过滤组件、排序组件、全局异常处理、自己封装的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://chengdu.cdxwcx.cn/article/dsogcde.html