过滤组件、排序组件、全局异常处理、自己封装的response对象
过滤组件
查询所有才涉及到过滤,其他接口都不需要
restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤
内置过滤类
使用内置过滤类的步骤
必须是继承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 视图类
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"]先注册好
全局异常处理
用于:统一接口返回
# 自定义异常方法,替换掉全局
# 写一个方法
# 自定义异常处理的方法
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={})