drf 过滤器组件与自定义过滤器

目录

  • 一、使用drf过滤器
  • 二、自定义过滤器
  • 三、使用django-filter模块
    • 3.1 基于django-filter模块自定义过滤器类实现价格区间

      • 自定义过滤器字段对照表

一、使用drf过滤器

  • drf过滤器:在GenericAPIView这个视图基类的def filter_queryset(self, queryset)方法中,通过self.filter_backends的配置来拿到过滤器并使用。但drf 默认在settings文件中的配置是空,既不使用过滤器。
  • drf默认为我们提供了两个过滤器类
    • class OrderingFilter(BaseFilterBackend) 用于排序

      使用时: 在url添加配置中参与排序的字段

    • class SearchFilter(BaseFilterBackend) 用于搜索

      使用时: 在url添加配置中参与搜索的字段

  • 如果我们要使用过滤器也可以通过局部配置全局配置来进行使用

局部配置:

from rest_framework.generics import ListAPIView
# OrderingFilter排序、SearchFilter搜索
from rest_framework.filters import OrderingFilter, SearchFilter

class FreeCourseListAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by(
        "-orders").all()
    serializer_class = serializers.FreeCourseModelSerializer

    # 局部配置过滤器类
    filter_backends = [OrderingFilter, SearchFilter]

    # 参与排序的字段: ordering=-price,id,students
    ordering_fields = ['price', 'id', 'students']

    # 参与搜索的字段: search=python  (name字段中带python就ok)
    search_fields = ['name', 'brief']

# 携带排序的过滤参数的url: http://127.0.0.1:8000/course/free?ordering=-price 降序
# 携带搜索的过滤参数的url: http://127.0.0.1:8000/course/free?search=python (name字段中带python就ok)

二、自定义过滤器

  • 自定义过滤器类。继承BaseFilterBackend(实际上看过源码你就知道继不继承都可以,因为BaseFilterBackend类并没有做什么实质性的事情)
  • 实现def filter_queryset(self, request, queryset, view) 方法,必须返回一个queryset对象

自定义过滤器类

from rest_framework.filters import BaseFilterBackend
# 自定义过滤器类
class LimitFilter(BaseFilterBackend):
    # 必须实现filter_queryset方法,返回queryset对象
    def filter_queryset(self, request, queryset, view):
        # 取出过滤条件
        limit = request.query_params.get("limit")   # 过滤参数
        try:
            return queryset[:int(limit)]
        except:
            return queryset

使用自定义过滤器类

from . import filters
class FreeCourseListAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by(
        "-orders").all()
    serializer_class = serializers.FreeCourseModelSerializer

    # 局部配置过滤器类
    filter_backends = [filters.LimitFilter]

# 携带自定义过滤字段参数的url: http://127.0.0.1:8000/course/free?limit=1

三、使用django-filter模块

django-filter模块可以做一些更高级的过滤,也可以自定义过滤,比如分类筛选、筛选区间等

安装依赖: pip install django-filter

django-filter模块为django和drf都做了相应的支持。如果是drf做前后端分离的项目就使用from django_filters.rest_framework import DjangoFilterBackend

使用:

? 局部配置过滤器类:filter_backends = [DjangoFilterBackend]

? 参与分类筛选的字段:filter_fields = [‘course_category‘](看源码得知,其实源码中反射了2个字段名,分别是:filterset_fields、filter_fields,反射了两个类名,分别是:filterset_class、filter_class、

# 分类筛选:django-filter:filter_backends配置DjangoFilterBackend,再在filter_fields中配置分组筛选的字段
from django_filters.rest_framework import DjangoFilterBackend

class FreeCourseListAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by(
        "-orders").all()
    serializer_class = serializers.FreeCourseModelSerializer

    # 局部配置过滤器类
    filter_backends = [DjangoFilterBackend]
    # 参与分类筛选的字段:
    filter_fields = ['course_category']

# 携带分类筛选字段的参数的url: http://127.0.0.1:8000/course/free?course_category=2

3.1 基于django-filter模块自定义过滤器类实现价格区间

  • 自定义过滤器类。继承from django_filters.rest_framework.filterset import FilterSet
  • 自定义分类筛选的字段。在Meta类中通过fields来指定筛选的字段。和定义序列化类方法一致

自定义过滤器类

# 基于django-filter插件,完成指定区间筛选(一般都是对应数字字段)
from django_filters.rest_framework.filterset import FilterSet
from django_filters import filters
from . import models
class CourseFilterSet(FilterSet):
    # field_name:要过滤的数据库字段,lookup_expr:过滤条件
    min_price = filters.NumberFilter(field_name='price', lookup_expr='gte') # 条件:大于price
    max_price = filters.NumberFilter(field_name='price', lookup_expr='lte') # 条件:小于price
    class Meta:
        model = models.Course
        # 参与分类筛选的字段:
        fields = ['course_category', 'max_price', 'min_price']

使用自定义过滤器类

# 分类筛选:django-filter:filter_backends配置DjangoFilterBackend,再在filter_fields中配置分组筛选的字段
from django_filters.rest_framework import DjangoFilterBackend
# 自定义过滤器类
from . import filters
class FreeCourseListAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by(
        "-orders").all()
    serializer_class = serializers.FreeCourseModelSerializer

    # 局部配置过滤器类
    filter_backends = [DjangoFilterBackend]
    # 使用基于django-filter自定义过滤器类
    filter_class = filters.CourseFilterSet

# 携带分类筛选字段的参数的url: http://127.0.0.1:8000/course/free?min_price=20&max_price=80

自定义过滤器字段对照表

models.AutoField:                   {'filter_class': NumberFilter},
models.CharField:                   {'filter_class': CharFilter},
models.TextField:                   {'filter_class': CharFilter},
models.BooleanField:                {'filter_class': BooleanFilter},
models.DateField:                   {'filter_class': DateFilter},
models.DateTimeField:               {'filter_class': DateTimeFilter},
models.TimeField:                   {'filter_class': TimeFilter},
models.DurationField:               {'filter_class': DurationFilter},
models.DecimalField:                {'filter_class': NumberFilter},
models.SmallIntegerField:           {'filter_class': NumberFilter},
models.IntegerField:                {'filter_class': NumberFilter},
models.PositiveIntegerField:        {'filter_class': NumberFilter},
models.PositiveSmallIntegerField:   {'filter_class': NumberFilter},
models.FloatField:                  {'filter_class': NumberFilter},
models.NullBooleanField:            {'filter_class': BooleanFilter},
models.SlugField:                   {'filter_class': CharFilter},
models.EmailField:                  {'filter_class': CharFilter},
models.FilePathField:               {'filter_class': CharFilter},
models.URLField:                    {'filter_class': CharFilter},
models.GenericIPAddressField:       {'filter_class': CharFilter},
models.CommaSeparatedIntegerField:  {'filter_class': CharFilter},
models.UUIDField:                   {'filter_class': UUIDFilter},

原文地址:https://www.cnblogs.com/XuChengNotes/p/12019774.html

时间: 2024-08-02 22:57:55

drf 过滤器组件与自定义过滤器的相关文章

angularJs的过滤器扩展及自定义过滤器

一.过滤器扩展 1.过滤器的组合使用 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <script src="angular.min.js&

django之创建第6-1个项目-自定义过滤器

1.在站点blog目录下创建templatetags文件夹 2.templatetags目录下需要作为一个包来处理和调用其中的内容,需要有一个__init__.py文件 3.在templatetags目录下创建percent.py文件(里面定义过滤器) 4.编写percent.py文件,定义过滤器 # -*- coding: UTF-8 -*- #自定义过滤器,注意这里编码一定不要掉了,不然会报错啊~~~~ from django import template register = templ

VueJs 自定义过滤器使用总结

过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数.Vue有很多很便利的过滤器,可以参考官方文档, http://cn.vuejs.org/api/#过滤器 ,过滤器通常会使用管道标志 " | ", 比如: {{ msg | uppercase }} // 'abc' => 'ABC' 在上述的例子中,在插值的时候,使用了Vue的一个uppercase过滤器,msg可以是直接写死,写成{{ 'abc' | uppercase }},也可以利用用户输入来改

DRF ---- 过滤组件 分页组件 过滤组件插件使用

目录 DRF过滤组件 1 源码分析: 2 全局配置 过滤 类们 3 局部配置 过滤 类们 4 系统提供 过滤 类们 OrderingFilter(排序过滤) SearchFilter(查询过滤) 联合使用 DRF分页组件 1 全局配置 2 局部配置 3 PageNumberPagination基础分页 4 LimitOffsetPagination偏移分页 5 CursorPagination游标分页 加密分页(了解) 6.自定义过滤器 7 django-filter 过滤插件(重点) 安装 自

Vue组件--局部过滤器 和 局部自定义指令

注意:     局部过滤器 和 局部自定义指令 需要在组件内部定义,并且只有当前组件才可以使用,组件外无效 1.  定义局部过滤器 使用filters来定义,他是一个对象,里面是以过滤器名称为名的一个函数,它time是默认的参数,即需要过滤的数据.示例如下 1 <body> 2 <div id="app"> 3 <one></one> <!--应用组件 --> 4 <two></two> 5 </

Django模板之自定义过滤器/标签/组件

自定义步骤: 1.     在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.     在app应用中创建templatetags模块包(模块名只能是templatetags) 3.     创建任意 .py 文件,如:my_tags.py ·   导入模块:from django import template ·   实例化注册器:register = template.Library()   #register的名

vue-cli 自定义过滤器的使用

vue-cli 自定义过滤器的使用 vue2.0将内置过滤器去除,所以过滤器需要自己编写. Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符指示: {{ message | capitalize }} <div v-bind:id="rawId | formatId"></div> 步骤: 第一步:编写过滤器

自定义过滤器和标签 &amp; 静态文件相关

自定义过滤器和标签 1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名只能是templatetags) 3.创建任意 .py 文件,如:my_tags.py from django import template from django.utils.safestring import mark_safe register = template.Library() #r

Django中自定义过滤器的使用

我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文件,配置urls映射,编写views试图,编写模板templates,编写models模块 切记 注册应用.  很多伙伴找不到自己定义的过滤器,是因为忘记注册应用! 2 创建过滤器的目录: 实际上,在项目目录或者应用目录下创建都是可以的,创建一个名为templatetags的python模块 在我这