过滤组件

过滤组件

群查排序过滤器

drf写好的

第一步
from rest_framework.filters import OrderingFilter

第二步
局部配置过滤器
filter_backends = [OrderingFilter,]
参与排序的字段: ordering=-price,id
ordering_fields = ['price', 'id', 'students']

第三步
请求链接样式
http://127.0.0.1:8080?ordering=-price,id
价格排序完一样的按照id排序

自定义群查过滤器(限制数据的个数)

第一步
在创建的app文件夹下面创建一个filters.py文件,名字随便

第二步
from rest_framework.filters import BaseFilterBackend
重写类继承BaseFilterBackend,重写filter_queryset方法

from rest_framework.filters import BaseFilterBackend

class LimitFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        li = request.query_params.get('li')
        try:
            # 取得到返回的是处理过后的queryset, 但是li可能是不是数字
            return queryset[:int(li)]
        except:
            # 取不到返回原来的
            return queryset

第三步
导入自定义过滤器
from .filters import LimitFilter

第四步
配置过滤器
filter_backends = [LimitFilter,]

群查搜索过滤器

第一步
from rest_framework.filters import SearchFilter

第二步
配置过滤器
filter_backends = [SearchFilter,]

第三步
配置可搜索的字
search_fields = ['name', 'brief']
search解决的是全文搜索(也就是当前接口的序列化类连接的表中的字段)
连表的字段无法查询

第四步
请求链接样式
http://127.0.0.1:8080?search=python

群查分页器过滤器

一个类只能配置一个分页器
第一步
在创建的app文件夹下面创建一个paginations.py文件,名字随便

第二步
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
重写类继承

  1. BaseFilterBackend(普通分页器),
  2. LimitOffsetPagination(偏移分页器),
  3. CursorPagination(排序分页器)

重写filter_queryset方法
代码:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

# 普通分页器
class CoursePageNumberPagination(PageNumberPagination):
    # 默认一页条数
    page_size = 2
    # 选择哪一页的key
    page_query_param = 'page'
    # 一般不开放自定义
    # 用户自定义一页条数
    page_size_query_param = 'page_size'
    # 用户自定义一页最大控制条数
    max_page_size = 10
    
    
# 偏移分页器(可以从第几条加载到第几条)
class CourseLimitOffsetPagination(LimitOffsetPagination):
    # 默认一页条数
    default_limit = 2
    # 从offset开始往后显示limit条
    limit_query_param = 'limit'
    offset_query_param = 'offset'
    max_limit = 2
    

# 排序分页器(按照规则排序并且分页)
class CourseCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'
    page_size = 2
    page_size_query_param = 'page_size'
    max_page_size = 2
    # ordering = 'id'  # 默认排序规则,不能和排序过滤器OrderingFilter共存

第三步
导入自定义分页器
from .paginations import CoursePageNumberPagination, CourseLimitOffsetPagination, CourseCursorPagination

第四步
配置自定义分页器(同一个接口下面只能配置一个分页器)
pagination_class = CoursePageNumberPagination
pagination_class = CourseLimitOffsetPagination
pagination_class = CourseCursorPagination

分类筛选过滤器

安装django-filter插件

需要安装 django-filter 插件
pip install django-filter
django-filter里面重写了djangorest_frameworkfilter,意味着既可以做前后端 不分离的分类筛选,也可以做前后端分离的分类筛选.

分类过滤器的使用

第一步
安装django-filter模块

第二步
导包
from django_filters.rest_framework import DjangoFilterBackend

第三步
配置分类过滤器
filter_backends = [DjangoFilterBackend,]

第四步
配置分类字段(必须是序列化表中有的字段,可以是外键字段)
filter_fields = ['course_category']

第五步
请求链接样式
http://127.0.0.1:8080?course_category=2

区间筛选过滤器

基于django-filter插件, 完成指定区间筛选(一般是针对于数字字段)

第一步
在创建的app文件夹下面创建一个filters.py文件,名字随便

第二步
导入所需模块
from django_filters.rest_framework.filterset import FilterSet
from django_filters.rest_framework import filters
继承 FilterSet
类似于写序列化类的方式重写
NumberFilter: filters提供的数据类型,还有很多对应的数据类型
lte: 小于等于
gte: 大于等于
field_name: 指定可以区间分类的字段,而且必须是序列化类中的序列化的字段
代码:

from django_filters.rest_framework.filterset import FilterSet
from django_filters.rest_framework import filters
from . import models

class CourseFilterSet(FilterSet):
    # 价格小于指定价格(lte)
    max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
    # 价格大于指定价格(gte)
    min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')

    class Meta:
        model = models.Course
        fields = ['price', 'max_price', 'min_price']

第三步
导包
from django_filters.rest_framework import DjangoFilterBackend
导入自定义分类过滤器类
from .filters import CourseFilterSet
配置过滤器类
filter_backends = [DjangoFilterBackend]
配置
filter_fields = ['course_category'] - django_filter帮我们写的
filter_class = CourseFilterSet - 我们自己自定义的分类过滤

posted @ 2019-12-04 23:35  cheerxiong  阅读(558)  评论(0编辑  收藏  举报