DRF - 过滤与排序、分页组件
目录
过滤与排序
必须继承GenericAPIView及其子类才能使用这种方法,配置过滤类的方式,用APIView的话得自己写orm与来实现搜索功能
3中过滤方式:drf内置的、第三方的、自己写的
1.drf内置过滤类【继承GenericAPIView
】
导入内置过滤器 - SearchFilter
from rest_framework.filters import SearchFilter
views.py -
"内置过滤器"
from rest_framework.filters import SearchFilter
class BookDetailView(ViewSetMixin, RetrieveAPIView):
"""查询单个"""
queryset = Book.objects.all()
serializer_class = BookSerializer
# 过滤器选择 : 内置过滤器-SearchFilter
filter_backends = [SearchFilter]
# 过滤字段
search_fields = ['name', 'price'] # 匹配条件是 【或】的关系
搜索方式
地址栏中通过关键字search来进行匹配
http://127.0.0.1:8000/api/v1/books/?search=红
2.第三方过滤器
导入模块
这里用到了第三方模块django-filters
from django_filter.rest_framework import DjangoFilterBackend
views.py
"第三方过滤器"
from django_filter.rest_framework import DjangoFilterBackend
class BookDetailView(ViewSetMixin, RetrieveAPIView):
"""查询单个"""
queryset = Book.objects.all()
serializer_class = BookSerializer
# 过滤器选择 : 内置过滤器-DjangoFilterBackend
filter_backends = [DjangoFilterBackend]
# 过滤字段
search_fields = ['name']
支持的查询方式
http://127.0.0.1:9000/api/v1/books/?price=939
http://127.0.0.1:9000/api/v1/books/?price=939&name=红
3.自定义定制过滤类实现过滤
#第一步; 定义一个过滤类,继承BaseFilterBackend,重写filter_queryset方法
class CommonFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 在里面实现过滤,返回qs对象,就是过滤后的数据
price_gt = request.query_params.get('price_gt', None)
if price_gt:
qs = queryset.filter(price__gt=int(price_gt))
return qs
else:
return queryset
# 第二步:配置在视图类上
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [CommonFilter] # 可以定制多个,从左往右,依次执行
4.排序
内置排序模块
导入模块
from rest_framework.filters import OrderingFilter
views.py
class BookView(ViewSetMixin, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [OrderingFilter]
ordering_fields = ['price']
支持的查询方法
http://127.0.0.1:8000/api/v1/books/?ordering=price
http://127.0.0.1:8000/api/v1/books/?ordering=-price
http://127.0.0.1:8000/api/v1/books/?ordering=-id,price
分页
drf内置了三个分页器,对应三种分页方式,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用
1.分页组件
1.PageNumberPagination 基本分页方式
- http://127.0.0.1:8000/api/v1/books/?page=2&size=3
2.LimitOffsetPagination 偏移分页
- http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1
- 从第一条开始,取4条
3.CommonCursorPagination 游标分页
- 只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好
2.定制分页器
page.py
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
# 网页用它
class CommonPageNumberPagination(PageNumberPagination):
page_size = 2 # 每页显示2条
page_query_param = 'page' # page=10 查询第10页的数据,每页显示2条
page_size_query_param = 'size' # page=10&size=5 查询第10页,每页显示5条
max_page_size = 5 # 每页最大显示10条
# LimitOffset
class CommonLimitOffsetPagination(LimitOffsetPagination):
default_limit = 3 # 每页显示2条
limit_query_param = 'limit' # limit=3 取3条
offset_query_param = 'offset' # offset=1 从第一个位置开始,取limit条
max_limit = 5
# offset=3&limit=2 0 1 2 3 4 5
# app 用下面
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询参数
page_size = 2 # 每页多少条
ordering = 'id' # 排序字段