过滤,排序,异常处理


过滤

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=西游记

自定义过滤类

  1. 写一个类继承BaseFilterBackend,重写filter_queryset方法
  2. 在这个方法中自定义过滤规则,返回过滤后的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

异常处理

两个功能:

  1. 出现异常时,返回统一的格式
  2. 记录异常日志

自定义异常方法

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',
    }