过滤,排序,异常处理
过滤
drf自己原生的过滤不能根据外键字段来过滤,django_filter支持外键字段来过滤
1. # 安装django_filter
2. # 在项目配置文件的APP中注册
INSTALLED_APPS = [
...
'django_filters',
]
3. # 全局配置或局部配置
REST_FRAMEWORK = {
...
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}
4. # 在视图类中写:过滤字段,一般针对查询的记录有多条时使用,比如查询所有
filter_fields=('name',)
# 在url中的写法,不需要加引号
http://127.0.0.1:8000/books3/?name=西游记
自定义过滤类
- 写一个类继承BaseFilterBackend,重写filter_queryset方法
- 在这个方法中自定义过滤规则,返回过滤后的queryset对象
drf的排序
# 在视图类中局部配置
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
class BooksView3(ListAPIView,CreateAPIView):
queryset = Book.objects
serializer_class = BookModelSerializer
# 把过滤和排序都配置了
filter_backends = [DjangoFilterBackend,OrderingFilter]
filter_fields=('name',)
ordering_fields=('nid','price')
# 在url中的写法,加-表示降序,默认升序
http://127.0.0.1:8000/books3/?ordering=-price
异常处理
两个功能:
- 出现异常时,返回统一的格式
- 记录异常日志
自定义异常方法
from rest_framework.views import exception_handler
from rest_framework.response import Response
def my_exception_handler(exc,context):
# drf的exception_handler函数处理了一些异常,返回了一些东西,有的异常没有处理,直接返回None,交给django处理
response=exception_handler(exc,context)
# 拦截drf的异常处理返回的东西,自己定制返回的格式和内容
if not response:
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)
# 在项目的配置文件中全局配置
REST_FRAMEWORK = {
...
'EXCEPTION_HANDLER': 'app01.my_auth.my_exception_handler',
}