过滤、排序、全局异常

过滤

内置过滤类的使用

1 在视图类中(必须继承GenericAPIView)

2 写如下
    #配置过滤类
    filter_backends=[SearchFilter,]
    # 配置过滤字段
    search_fields=['name','price']
    
3 浏览的地址:
	#查询的时候,所有条件都给search,并支持模糊匹配
	http://127.0.0.1:8000/api/book/?search=黑楼梦
	http://127.0.0.1:8000/api/book/?search=黑楼梦
            
4 全局使用:在配置文件中配置
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

第三方过滤类使用(django-filter)

# 安装(django:2.2, 3.1, 3.2)
	pip3 install django-filter
    
1 在视图类中(必须继承GenericAPIView)

2 写如下
    #配置过滤类
    filter_backends=[DjangoFilterBackend,]
    # 配置过滤字段
    filter_fields=['name','price']
    
3 浏览的地址:
	http://127.0.0.1:8000/api/book/?price=12&name=黄楼梦
	http://127.0.0.1:8000/api/book/?price=12
        
4 全局使用:在配置文件中配置
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

自己定义过滤类

1 写一个过滤类
from rest_framework.filters import BaseFilterBackend
class Myfilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        name = request.GET.get('name')
        queryset = queryset.filter(name__contains=name)
        return queryset
    
2 在视图类中配置
	## 自己定义的
    filter_backends = [Myfilter, ]

排序

1 在视图类中
    ##排序
    filter_backends = [OrderingFilter, ]
    ordering_fields=['price','name']
    
2 请求方式:
	http://127.0.0.1:8000/api/book/?ordering=-price
	http://127.0.0.1:8000/api/book/?ordering=price
	http://127.0.0.1:8000/api/book/?ordering=-price,-name

异常处理

1 写一个函数
from rest_framework.response import  Response
def my_exception_handler(exc, context):
    response=exception_handler(exc, context)
    print(response)
    print(exc)
    print(context.get('view'))
    print(context.get('request').get_full_path())
    if not response: #更新粒度的对异常做一个区分
        if isinstance(exc,IndexError):
            response=Response({'status':5001,'msg':'越界异常'})
        elif isinstance(exc,ZeroDivisionError):
            response = Response({'status': 5002, 'msg': '越界异常'})
        else:
            response= Response({'status': 5000, 'msg': '没有权限'})
    # 记录日志
    return response

2 在配置文件中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER':'app01.excepiton.my_exception_handler'
}

3 只要以后视图函数中出了错误,都会返回统一格式
posted @ 2021-04-30 09:05  最冷不过冬夜  阅读(45)  评论(0编辑  收藏  举报