zoukankan      html  css  js  c++  java
  • 过滤组件

    过滤组件

    群查排序过滤器

    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 - 我们自己自定义的分类过滤

  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11986519.html
Copyright © 2011-2022 走看看