过滤组件、排序组件、全局异常处理、自己封装的response对象

过滤组件、排序组件、全局异常处理、自己封装的response对象

过滤组件

查询所有才涉及到过滤,其他接口都不需要
restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤

内置过滤类

使用内置过滤类的步骤

必须是继承GenericAPIView+ListModelMixin的之类视图上

1.配置过滤类
    filter_backends=[SearchFilter,]
2.配置过滤类的字段
    search_fields = ["name", ]
3.支持前端的访问形式
    http://127.0.0.1:8000/books/?search=三 # 只要name中或publish中有三都能搜出来

内置过滤类只能通过search写条件,如果配置了多个过滤字段,是或者的条件

image

采用第三方过滤组件

#1 安装:pip3 install django-filter
#2 注册,在app中注册django-filter
#3 全局配,或者局部配
 "DEFAULT_FILTER_BACKENDS": ("django_filters.rest_framework.DjangoFilterBackend",)
#4 视图类
class BookView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_fields = ("name",)  #配置可以按照哪个字段来过滤

排序组件

排序功能只针对于所有接口,继承了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

全局异常处理

用于:统一接口返回

# 自定义异常方法,替换掉全局
# 写一个方法
# 自定义异常处理的方法
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={})
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 过滤组件、排序组件、全局异常处理、自己封装的response对象