分页组件
基础分页(常用)
方法一: 直接使用 drf 分页类,在视图中完成分页类的必要配置 from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer pagination_class = PageNumberPagination PageNumberPagination.page_size = 1
自定义分页
方法二: 自定义分页类继承 drf 分页类,在自定义分页类中完成配置,视图类中使用自定义分页类 1 重写分页类,自定义同名类继承 drf 的分页类 2 完成必要的配置 3 将重写的分页类配置给群查需求的视图类
pagination.py
from rest_framework.pagination import PageNumberPagination as DrfPageNumberPagination class PageNumberPagination(DrfPageNumberPagination): # 默认一页显示的条数 page_size = 2 # url 中携带页码的 key page_query_param = 'page' # url 中用户携带自定义一页条数的 key page_size_query_param = 'page_size' # 用户最大可自定义一页的条数 max_page_size = 2
views.py
# 导入自己的类 from . import pagination from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer # 一行 pagination_class = pagination.PageNumberPagination
偏移分页
pagination.py
from rest_framework.pagination import LimitOffsetPagination as DrfLimitOffsetPagination class LimitOffsetPagination(DrfLimitOffsetPagination): # 默认一页显示的条数 default_limit = 1 # url 中用户携带自定义一页条数的 key limit_query_param = 'limit' # url 中用户携带自定义偏移条数的 key offset_query_param = 'offset' # 用户最大可自定义一页的条数 max_limit = 3
views.py
... # 偏移分页器,没有固定页码,自定义从偏移量开始网后续查询自定义条数 # http://127.0.0.1:8000/course/free/?offset=1&limit=2 pagination_class = pagination.LimitOffsetPagination
游标分页(了解)
pagination.py
# 游标分页器 from rest_framework.pagination import CursorPagination as DrfCursorPagination class CursorPagination(DrfCursorPagination): # 默认一页显示的条数 page_size = 2 # url中携带页码的key(编码后的结果) cursor_query_param = 'cursor' # url中用户携带自定义一页条数的key page_size_query_param = 'page_size' # 用户最大可自定义一页的条数 max_page_size = 3 # 游标分页器的特殊点: # 1)如果视图类没有配 排序过滤组件filter_backends = [OrderingFilter],采用 ordering 设置的作为默认排序规则 # 2)如果视图类配了 排序过滤组件filter_backends = [OrderingFilter],url请求必须带上ordering排序规则,因为默认排序规则失效 # 注:因为游标分页是基于排序后结果上的分页 ordering = '-price'
过滤组件
搜索组件
""" 搜索组件 1)在视图文件views.py中导入drf的搜索组件 from rest_framework.filters import SearchFilter 2)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [SearchFilter] 3)配置视图类关联的Model表参与搜索的字段 search_fields = ['name', 'id'] 4)前台访问该群查接口,采用拼接参数方式用search关键字将搜索目标提供给后台 http://127.0.0.1:8000/course/free/?search=2 # id或name中包含2的所有结果 """
自定义过滤组件
自定义过滤器
1)自定义类实现filter_queryset方法即可,接收request, queryset, view参数
2)制定过滤条件,将过滤成功后的queryset返回即可,如果过滤失败,返回原样的queryset
3)将自定义过滤类配置给群查视图类的filter_backends
fiters.py
# 前台接口:/course/free/?count=2 ,代表只对前台返回2条数据 class CountFilter: def filter_queryset(self, request, queryset, view): count = request.query_params.get('count', None) try: # 结论:drf的搜索组件和排序组件都是建立在表的所有数据基础上的过滤规则,所以该自定义过滤类在视图类配置中 # filter_backends = [SearchFilter, OrderingFilter, CountFilter] 必须在前两者之后 return queryset[:int(count)] except: return queryset
views.py
from rest_framework.filters import SearchFilter, OrderingFilter from . import pagination from .filters import CountFilter from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer filter_backends = [SearchFilter, OrderingFilter, CountFilter] # orderingFilter 排序 http://127.0.0.1:8000/course/free/?ordering=-price,id search_fields = ['name', 'id']
# Django-filter 插件
安装
pip install django-filter
models 有的字段用方式一,其他看情况
分类过滤 方式一
1)在视图文件views.py中导入django-filter的功能组件 from django_filters.rest_framework import DjangoFilterBackend 2)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [DjangoFilterBackend] 3)配置视图类关联的Model表可以分类的字段(通常是可以分组的字段) filter_fields = ['course_category'] 4)前台访问该群查接口,采用拼接参数方式用分类course_category字段将分类条件提供给后台 http://127.0.0.1:8000/course/free/?course_category=1 # 拿课程分类1下的所有课程
from django_filters.rest_framework import DjangoFilterBackend class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer filter_backends = [DjangoFilterBackend] filter_fields = ['course_category']
分类过滤 方式二
1)自定义过滤类继承django-filter插件的FilterSet类,绑定Model表,并设置分类字段 新建 filters.py 文件 from django_filters.filterset import FilterSet from . import models class CourseFilterSet(FilterSet): class Meta: model = models.Course fields = ['course_category'] 2)在视图文件views.py中导入django-filter的功能组件及自定义的过滤类 from django_filters.rest_framework import DjangoFilterBackend from .filters import CourseFilterSet 3)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [DjangoFilterBackend] 4)配置视图类关联的自定义过滤类 filter_class = CourseFilterSet 5)前台访问该群查接口,采用拼接参数方式用分类course_category字段将分类条件提供给后台 http://127.0.0.1:8000/course/free/?course_category=1 # 拿课程分类1下的所有课程
区间过滤
""" 1)自定义过滤类继承django-filter插件的FilterSet类,绑定Model表,并设置自定义区间规则字段 from django_filters.filterset import FilterSet from . import models class CourseFilterSet(FilterSet): # 区间过滤:field_name关联的Model字段;lookup_expr设置规则;gt是大于,gte是大于等于; min_price = filters.NumberFilter(field_name='price', lookup_expr='gte') max_price = filters.NumberFilter(field_name='price', lookup_expr='lte') class Meta: model = models.Course fields = ['min_price', 'max_price'] 2)在视图文件views.py中导入django-filter的功能组件及自定义的过滤类 from django_filters.rest_framework import DjangoFilterBackend from .filters import CourseFilterSet 3)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [DjangoFilterBackend] 4)配置视图类关联的自定义过滤类 filter_class = CourseFilterSet 5)前台访问该群查接口,采用拼接参数方式用自定义区间规则字段将区间条件提供给后台 http://127.0.0.1:8000/course/free/?min_price=30&max_price=60 # 拿课程价格在30~60的所有课程 """