一、过滤

对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块

使用方法:

# 1、注册,在app中注册 settings.py
INSTALLED_APPS = [
'django_filters',
] # 2、settings.py 配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
)
} # 3、在视图中添加filter_fields属性,指定过滤的字段
class BooksView(ModelViewSet):
queryset = Books.objects.all()
serializer_class = BooksSerializer filter_fields = ('title',) # 配置可以按照哪个字段来过滤 # http://127.0.0.1:8000/books/?title=红楼梦

二、排序

排序可以使用 Rest Framework 提供的 OrderingFilter 来快速指明数据按指定字段进行排序

使用方法:

# 1、首先视图中设置filter_backends=[OrderingFilter]
# 2、然后再视图中添加 ordering_fields 属性,指定排序字段 from rest_framework.filters import OrderingFilter
class BooksView(ModelViewSet):
queryset = Books.objects.all()
serializer_class = BooksSerializer filter_backends = [OrderingFilter] # 第一步
ordering_fields = ['price','id'] # 第二步 # http://127.0.0.1:8000/books/?ordering=id 通过ordering查看有无指明排序的字段,并通过字段来排序
# -id 表示针对id字段进行倒序排序
# id 表示针对id字段进行升序排序

三、分页

首先 Rest Framework 提供了三种分页方式,并且

  • PageNumberPagination
  • LimitOffsetPagination
  • CursorPagination

使用方式一:可以直接继承使用,但是配置参数需要在settings.py里面配置

使用方式二:通过子类继承父类分页器使用,直接在子类中修改父类的参数(推荐)

PageNumberPagination

子类中的属性:

  • page_size:每页数目
  • page_query_param:前端发送的页数关键字,默认“page”
  • page_size_query_param:前端发送每页数目关键字名,默认None
  • max_page_size:前端最多能设置的每页数量

如何使用:

from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination
from app01.models import Books
from app01.ser import BooksSerializer # 第一步:
class BookPageNumberPagination(PageNumberPagination):
page_size = 3 # 每页条数
page_query_param = 'page' # 查询第几页的key
page_size_query_param = 'size' # 每一页显示的条数
max_page_size = 5 # 每页最大条数 class BookView(ListAPIView):
queryset = Books.objects.all()
serializer_class = BooksSerializer # 第二步:分页配置
pagination_class = BookPageNumberPagination # url:http://127.0.0.1:8000/books/?page=1&size=5 查询第1页,一共显示五条数据

LimitOffsetPagination

子类中的属性:

  • default_limit:默认限制,默认值与PAGE_SIZE设置一致
  • limit_query_param:limit参数名,默认’limit’
  • offset_query_param:offset参数名,默认’offset’
  • max_limit:最大limit限制,默认None

如何使用:

from rest_framework.generics import ListAPIView
from rest_framework.pagination import LimitOffsetPagination
from app01.models import Books
from app01.ser import BooksSerializer # 第一步:
class BookLimitOffsetPagination(LimitOffsetPagination):
default_limit = 3 # 每页条数
limit_query_param = 'limit' # 往后拿几条
offset_query_param = 'offset' # 从第几条往后拿几条的标杆
max_limit = 5 # 每页最大拿几条 class BookView(ListAPIView):
queryset = Books.objects.all()
serializer_class = BooksSerializer # 第二步:分页配置
pagination_class = BookLimitOffsetPagination # url:http://127.0.0.1:8000/books/?limit=3&offset=4 从第三条开始往后拿4条数据

CursorPagination

子类中的属性:

  • cursor_query_param:默认查询字段,不需要修改
  • page_size:每页数目
  • ordering:按什么排序,需要指定

如何使用:

CursorPagination的查询速度快,但是却不能定位到第几页这样查,要么往前查,要么往后查。

from rest_framework.generics import ListAPIView
from rest_framework.pagination import CursorPagination
from app01.models import Books
from app01.ser import BooksSerializer # 第一步:
class BookCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 每页查询的key
page_size = 3 # 每页显示条数
ordering = 'id' # 排序字段 class BookView(ListAPIView):
queryset = Books.objects.all()
serializer_class = BooksSerializer # 第二步:分页配置
pagination_class = BookCursorPagination # url:http://127.0.0.1:8000/books/?cursor=cD0z

继承APIView使用方法

像方式一,方式二这样使用的话,就要视图类是继承 ListAPIView 然后直接配置就可以了

但是如果视图类继承的是 GenericAPIView 或者 APIView 的话,就需要用另一种方式了:

使用方法:

# 1、定义一个分页器
class BookPageNumberPagination(PageNumberPagination):
page_size = 3 # 每页条数
page_query_param = 'page' # 查询第几页的key
page_size_query_param = 'size' # 每一页显示的条数
max_page_size = 5 # 每页最大条数 class BookView(APIView): def get(self, request, *args, **kwargs):
book_list = Books.objects.all() # 2、实例化得到一个分页器对象
page_obj = BookPageNumberPagination() # 3、调用paginate_queryset返回每一页的数据
book_list = page_obj.paginate_queryset(book_list, request, view=self) # 4、获取上一页下一页链接
next_url = page_obj.get_next_link()
previous_url = page_obj.get_previous_link() # 5、序列化
book_ser = BooksSerializer(book_list, many=True) # 6、加入响应信息中
data = {'next_url': next_url, 'previous_url': previous_url, 'data': book_ser.data}
return Response(data=data)

四、异常处理

异常处理主要是用来统一接口返回

源码分析

异常处理在APIView的api_settings已经配置好了

'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',

def exception_handler(exc, context):
# 先判断是不是404
if isinstance(exc, Http404): # exc是异常信息的异常对象
exc = exceptions.NotFound()
# 然后判断是不是权限的问题
elif isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied() # 比如权限问题会返回一个字典 # 在判断你抛出的是不是API的异常——>认证权限这些都是继承了API的异常
if isinstance(exc, exceptions.APIException):
headers = {}
if getattr(exc, 'auth_header', None):
headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None):
headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, (list, dict)):
data = exc.detail
else:
data = {'detail': exc.detail} set_rollback()
return Response(data, status=exc.status_code, headers=headers)
# 只要是上面这些异常都做了处理 return None # 意味有些异常它没有处理,就会交给Django自己处理

如何处理

因为dir有些异常它不做处理,Django处理的又不符合我们的标准,所以就要写一个统一的异常类来替换掉它,把所有情况都处理,只要前端出异常看到的都是固定的东西。

如何写:

重写一个类,和它基本上差不多,配置的时候在 settings.py 里面全局配置

#  app01_auth.py
from rest_framework.views import exception_handler
from rest_framework.response import Response def app01_exception_handler(exc, context):
response = exception_handler(exc, context) # 原来的drf处理的我们也需要
# 两种情况,一个是None,drf没有处理,Django处理了,但是处理的不符合需求
# response对象,drf处理了我们需要的 if not response:
# 如果没处理,那么我们自己处理
return Response(data={'status': 400, 'error': str(exc)}, status=400)
else:
# drf 处理了,那么取出它处理的信息,重新处理一下
return Response(data={'status': 400, 'error': response.data.get('detail')}, status=400)

然后再全局配置一下:settings.py

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'app01.app_auth.app01_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":'xiaoyang'},token='dsafsdfa',aa='dsafdsfdee')
return APIResponse(data={"name":'xiaoyang'})
return APIResponse(code='101',msg='错误',data={"name":'xiaoyang'},token='dsafsdfa',aa='dsafdsfdee',header={})

DRF之过滤排序分页异常处理的更多相关文章

  1. DRF 过滤排序分页异常处理

    DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~

  2. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  3. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  4. drf07 过滤 排序 分页 异常处理 自动生成接口文档

    4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...

  5. drf框架 - 过滤组件 | 分页组件 | 过滤器插件

    drf框架 接口过滤条件 群查接口各种筛选组件数据准备 models.py class Car(models.Model): name = models.CharField(max_length=16 ...

  6. drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页

    签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: ...

  7. Contoso 大学 - 3 - 排序、过滤及分页

    原文 Contoso 大学 - 3 - 排序.过滤及分页 目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/ ...

  8. Ecside基于数据库的过滤、分页、排序

    首先ecside展现列表.排序.过滤(该三种操作以下简称为 RSF )的实现原理完全和原版EC一样, 如果您对原版EC的retrieveRowsCallback.sortRowsCallback.fi ...

  9. Mysql 单表查询-排序-分页-group by初识

    Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...

随机推荐

  1. strcasecmp函数和strncasecmp函数原型

    函数说明 strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异. 返回值    若参数s1和s2字符串相同则返回0.s1长度大于s2长度则返回大于0 的值,s1 长度若小 ...

  2. Redis SWAPDB 命令背后做了什么

    Redis SWAPDB 命令背后做了什么 目录 Redis SWAPDB 命令背后做了什么 0x00 摘要 0x01 SWAPDB 基础 1.1 命令说明 1.2 演示 0x02 预先校验 0x03 ...

  3. nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍

    layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...

  4. 使用goland调试远程代码

    前言 很多时候我们都在window上使用goland,并直接使用goland调试go代码. 但是很多时候我们的程序运行在Linux服务器上,虽然可以通过dlv命令行进行手动打断点调试,但是太麻烦了. ...

  5. Log4j实战,依赖分析

    背景 在项目中经常被log4j的各种依赖冲突搞的焦头烂额,久病成良医啊,在这里记录一下我对log4j的理解与分析 log4j 与 log4j2 log4j2是log4j的升级版,二者互不兼容,据说lo ...

  6. GO学习-(37) 使用Air实现Go程序实时热重载

    使用Air实现Go程序实时热重载 今天我们要介绍一个神器--Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率. 为什么需要实时加载? 之前使用P ...

  7. 用命令行开启关闭windows系统服务

    #删除服务 sc delete servicename   #启动服务 sc start servicename   #停止服务 sc stop servicename   #查询所有服务的状态 sc ...

  8. CPU消耗,跟踪定位理论与实践

    CPU消耗,跟踪定位理论与实践 一.性能指标之资源指标定位方案 1.打tprof报告方法 抓取perfpmr文件 60秒. perfpmr.sh 60 从结果文件中取出tprof.sum 或直接抓取t ...

  9. 广播 (broadcasting)

    广播 (broadcasting) 飞桨(PaddlePaddle,以下简称Paddle)和其他框架一样,提供的一些API支持广播(broadcasting)机制,允许在一些运算时使用不同形状的张量. ...

  10. MindSpore技术理解(上)

    MindSpore技术理解(上) 引言 深度学习研究和应用在近几十年得到了爆炸式的发展,掀起了人工智能的第三次浪潮,并且在图像识别.语音识别与合成.无人驾驶.机器视觉等方面取得了巨大的成功.这也对算法 ...