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

  • 相关阅读:
    vue.js 快速入门
    简洁的MVC思想框架——Nancy(Post操作与外部引用css和JS)
    简洁的MVC思想框架——Nancy(环境配置与Get操作)
    iOS开发之注册推送通知权限
    iOS开发之数组排序
    iOS开发之打包上传报错: ERROR ITMS-90087/ERROR ITMS-90125
    iOS开发之HTTP与HTTPS网络请求
    iOS开发之GCD同步主线程、异步主线程
    iOS开发之获取时间戳方法
    iOS开发之将字典、数组转为JSON字符串方法
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11986519.html
Copyright © 2011-2022 走看看