10.10内容整理和概述
今日内容概要
内容目录
分页
分页应用接口:查询所有的接口
'-------------继承GenericAPIView做分页---------------'
步骤:
1.新建py文件,编写分页类
2.导包:from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination # drf提供三个常用的分页类
'------------PageNumberPagination---------------'
3.编写自定义分页类,继承PageNumberPagination类
4.重写参数:
1.page_size:全局规定每页显示的数据条数
2.page_query_param:定义查询页数的变量名,附在路由上 # 默认为'page'
3.page_size_query_param:规定新变量'size',当附在路由上时,顶替page_size规定每页显示的数据条数的功能 # 例子:localhost/books/?page=3&size=4
4.max_page_size:限制每页显示的最大的条数
'------------LimitOffsetPagination---------------'
3.编写自定义分页类,继承LimitOffsetPagination类
4.重写参数:
1.default_limit:全局规定每页显示的数据条数
2.limit_query_param:局部定义该页显示的数据条数
3.offset_query_param:定义一个新变量,该变量控制条数起点(从哪一条开始取) # 例子: localhost/books/?offset=3&limit=4————从第三条数据开始取四条
4.max_limit:限制每页显示的最大的条数
'------------CursorPagination---------------'
# 特点:只能查找前一页和后一页,效率最高
3.编写自定义分页类,继承CursorPagination类
4.重写参数:
1.page_size:全局规定每页显示的数据条数
2.ordering:定义排序的字段名(必须表中字段) # 降序:-字段名
3.cursor_query_param = 'cursor'
'------------------------------------------'
5.在视图类中定义pagination_class属性 # 只有继承GenericAPIView,才能定义有效的pagination_class属性
6.将自定义分页类赋予pagination_class属性,只能有一个分页类
'-------------继承APIView做分页---------------'
步骤:
1.查询需要分页的数据
2.实例化自定义分页类对象
3.调用自定义分页类对象的paginate_queryset方法,传入实参(需要分页的数据,分页条件) # 分页条件在get请求体中
4.将经过分页返回的数据序列化
5.返回调用自定义继承的分页类的get_paginated_response方法封装序列化后的数据
代码演示:
class BookView1(APIView):
def get(self, request):
qs = Book.objects.all()
page = MyPageNumberPagination()
res = page.paginate_queryset(qs, request)
ser = BookSerializer(instance=res, many=True)
return page.get_paginated_response(ser.data)
排序
排序应用接口:查询所有的接口
'---------继承GenericAPIView+ListModelMixin的子视图类---------'
步骤:
1.在视图文件中导包:from rest_framework.filters import OrderingFilter
2.在视图类中配置filter_backends属性,数据类型为列表,将OrderingFilter配给它
3.配置ordering_fields属性,数据类型为列表,指定按哪些字段排序,排序顺序为前端传来字段的顺序 # 例子:ordering_fields=['id','price']
前端访问方式:
例子:http://127.0.0.1:8000/books/?ordering=-price,id
查询意思:先按价格的降序排,如果价格一样再按id的升序排
'---------继承APIView视图类---------'
思路:drf没有相关配置,自己从数据库拿取数据排序再返回
过滤
过滤应用接口:查询所有的接口
内置过滤类:
'---------继承GenericAPIView+ListModelMixin的子视图类---------'
步骤:
1.在视图文件中导包:from rest_framework.filters import SearchFilter
2.在视图类中配置filter_backends属性,数据类型为列表,将SearchFilter配给它
3.配置search_fields属性,数据类型为列表,指定按哪些字段做过滤,都做模糊查询 # 过滤字段为多字段时,字段关系为或(or)
前端访问方式:
例子:http://127.0.0.1:8000/books/?search=三 # 只能用search关键字搜索
查询意思:只要search_fields属性配置任一字段中有三的数据,都能搜出来
'---------继承APIView视图类---------'
思路:自己写过滤类
第三方过滤类:
类名:django-filter
使用步骤:
1.第三方模块,需要安装:pip3 install django-filter
2.在视图文件中导包:from django-filters.rest_framework import DjangoFilterBackend
3.在视图类中配置filter_backends属性,数据类型为列表,将DjangoFilterBackend配给它 # 例子:filter_backends = [DjangoFilterBackend, ]
4.配置filterset_fields属性,数据类型为列表,指定按哪些字段做过滤,当配置为字段时做精准匹配 # 例子:filterset_fields = ['name', 'publish']
前端访问方式:
例子:http://127.0.0.1:8008/books/?name=三国演义&publish=南京出版社 ## 过滤字段为多字段时,字段关系为与(and)
查询意思:name为三国演义且publish为南京出版社的数据
自定义过滤类:
步骤:
1.新建py文件,编写自定义过滤类,继承BaseFilterBackend # 注意导包
2.重写filter_queryset方法,编写过滤逻辑,返回qs对象 # 参数:self, request, queryset, view
3.配置在视图类的filter_backends参数上 # 例子:filter_backends = [MyFilter, ]
代码案例:
def filter_queryset(self, request, queryset, view):
name = request.query_params.get('name', None)
publish = request.query_params.get('publish', None)
qs = queryset.filter(name__icontains=name, publish__icontains=publish)
return qs
'''--------------总结-----------------'''
多个过滤类和排序类可以共用,filter_backends=[],可以配置多个,执行顺序是从做往右,所以,放在最左侧的尽量先过滤掉大部分数据