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里面

posted @ 2020-01-15 22:06  W文敏W  阅读(235)  评论(0编辑  收藏  举报