drf—过滤组件和分页组件
过滤组件与分页组件的使用简介
# views.py
# drf提供两种过滤组件类:全文搜索、排序
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
# 通过安装第三方库django-filter,即可使用第三种过滤组件:分类
from django_filters.rest_framework import DjangoFilterBackend
# drf提供三种分页类
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
class CourseViewSet(GenericViewSet, ListModelMixin):
# 过滤组件
filter_backends = [SearchFilter, OrderingFilter, DjangoFilterBackend]
# 过滤:全文搜索
search_fields = ['name'] # 按数据库非外键字段,包含了目标参数即可匹配
# 过滤:分类搜索
fields = [] # 按数据库字段,包括外键字段,完全相等才匹配到结果
filter_class = CourseFilterSet # 按设置的分类规则进行分类,优先级大于按字段分类
# 过滤:排序
ordering_fields = [] # 按数据库字段,包括外键字段
# 分页组件
pagination_class = PageNumberPagination
# pagination_class = LimitOffsetPagination
# 分页参数配置:PageNumberPagination
page_size = 100 # 每页显示最多的数目
page_query_param = 'page' # 前端发送的分页的页数参数的关键字名,默认位"page"
page_size_query_param = 'page_size' # 前端发送的每页数目参数的关键字名,默认位None
max_page_size = None # 前端最多能设置的每页数量
# 分页参数配置:LimitOffsetPagination
'''
default_limit = 100 # 每页显示最多的数目,默认配置与page_size相同,api_settings.PAGE_SIZE
limit_query_param = 'limit'
offset_query_param = 'offset' # 偏移多少数目的参数的关键字名
max_limit = None
'''
过滤组件和分页组件的入口函数
过滤与分页均只对群查接口有意义,因此只在群查中使用,即list()方法中调用组件的入口函数
但是组件的入口函数,是定义在GenericAPIView
中的
class GenericAPIView(views.APIView):
def filter_queryset(self, queryset):
pass
def paginate_queryset(self, queryset):
pass
过滤组件:分类filter_class
from . import models
from django_filters.filterset import FilterSet
from django_filters import filters
class CourseFilterSet(FilterSet):
# 通过NumberFilter类自定义分类字段
# 如下定义两个区间分类字段:teacher_id大于min_price和teacher_id小于max_price
min_price = filters.NumberFilter(field_name='teacher_id', lookup_expr='gte')
max_price = filters.NumberFilter(field_name='teacher_id', lookup_expr='lte')
class Meta:
model = models.Course
fields = ['参与分类的数据库字段'] # 自定义的min_price、max_price字段不需要写在fields里面