一、drf 提供的过滤器(ordering)

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # OrderingFilter排序
from rest_framework.filters import OrderingFilter, 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,]
# 参与排序的字段: ordering=-price, id
ordering_fields = ['price', 'id']

请求的url为http://127.0.0.1:8000/course/free?ordering=-price,id

二、自定义过滤器

以获取的数据条数为例

filters.py

# 继承BaseFilterBackend
from rest_framework.filters import BaseFilterBackend class LimitFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 获取前台想要的数据条数
limit = request.query_params.get('limit')
try:
return queryset[:int(limit)]
except:
return queryset

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # OrderingFilter排序
from rest_framework.filters import OrderingFilter,
from .filters import LimitFilter 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, LimitFilter] # LimitFilter为自定义过滤器
# 参与排序的字段: ordering=-price,id
ordering_fields = ['price']

三、群查搜索过滤器

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # SearchFilter搜索过滤器
from rest_framework.filters import 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 = [SearchFilter]
# 参与搜索的字段: search = python (意思是name字段中带python就可以了)
search_fields = ['name']

请求的url为:http://127.0.0.1:8000/course/free?search=python

四、drf分页器(pagination)

paginations.py

需自定义参数

# 继承分页器类
from rest_framework.pagination import PageNumberPagination class CoursePageNumberPagination(PageNumberPagination):
# 默认一页显示的条数
page_size = 2
# 选择哪一页的key,在url中?page=2,代表第二页
page_query_param = 'page'
# 用户自定义一页条数
page_size_query_param = 'page_size'
# 用户自定义一页最大控制条数
max_page_size = 10

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers from .paginations import CoursePageNumberPagination class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 分页器
pagination_class = CoursePageNumberPagination

请求的url为http://127.0.0.1:8000/course/free?page=1

五、偏移条数分页器(了解)

paginations.py

from rest_framework.pagination import LimitOffsetPagination

class CourseLimitOffsetPagination(LimitOffsetPagination):
# 默认一页条数
default_limit = 2
# 从offset开始往后显示limit条
limit_query_param = 'limit'
offset_query_param = 'offset'
# 最大一页最大条数
max_limit = 2

views.py

from rest_framework.generics import ListAPIView
from . import models, serializers from .paginations import CourseLimitOffsetPagination class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 偏移分页器
pagination_class = CourseLimitOffsetPagination

请求的url:http://127.0.0.1:8000/course/free?limit=1&offset=2

六、分类筛选过滤器

1.普通使用筛选

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # 分类筛选过滤器 pip install django-filter
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=1

2.区间筛选(高级使用)

filters.py

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

from django_filters.rest_framework.filterset import FilterSet
from django_filters 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 = ['course_category', 'max_price', 'min_price']

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # 自定义筛选器
from .filters import CourseFilterSet class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer
# 自定义筛选类
filter_class = CourseFilterSet

请求的url: http://127.0.0.1:8000/course/free?max_price=100&min_price=30

drf过滤器、分页器、筛选器的应用的更多相关文章

  1. ASP.NET MVC 如何使用自定义过滤器(筛选器)

    继承*****Attribute(筛选器三种具体类)-->重写方法-->标记在控制器 或者 方法上面 或者 在FilterConfig中Add [类名(类属性 = 值)]还有[AllowA ...

  2. MVC四大筛选器—ActionFilter&ResultedFilter

    AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...

  3. asp.net core 2.2 中的过滤器/筛选器(上)

    ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...

  4. ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序

    FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true protecte ...

  5. mvc 筛选器

    之前公司中,运用ActionFilterAttribute特性实现用户登录信息的验证,没事看了看,留下点东西备忘. 好的,瞅这玩意一眼就大概能猜到这货是干嘛的了吧,没错,action过滤器.其实就是A ...

  6. 基础教程:ASP.NET Core 2.0 MVC筛选器

    问题 如何在ASP.NET Core的MVC请求管道之前和之后运行代码. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServi ...

  7. Asp.net Web Api添加异常筛选器

    一.定义一个异常筛选器 using System;using System.Collections.Generic;using System.Linq;using System.Web;using S ...

  8. 绕过基于签名的XSS筛选器:修改HTML

    绕过基于签名的XSS筛选器:修改HTML 在很多情况下,您可能会发现基于签名的过滤器只需切换到一个不太熟悉的执行脚本的方法即可.如果失败了,您需要查看混淆攻击的方法. 本文提供了HTML语法可以被混淆 ...

  9. 过滤器,拦截器,aop区别与使用场景

    1. 什么是过滤器 过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中 ...

随机推荐

  1. 分布式id生成方案总结

    本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...

  2. 论文阅读 Prefetch-aware fingerprint cache management for data deduplication systems

    论文链接 https://link.springer.com/article/10.1007/s11704-017-7119-0 这篇论文试图解决的问题是在cache 环节之前,prefetch-ca ...

  3. [考试反思]1005csp-s模拟测试61:休止

    连续不知道多少场了,都是一场10名以内一场20以外...波动极大...还极有规律... 拿到这套题,看到T1大模拟无话可说. 然后考场上我觉得T2很简单....然后就码了两个半小时. T3数据水了暴力 ...

  4. 「刷题」JZPKIL

    这道反演题,真牛逼. 以下用$B$代表伯努利数,$l*g=f$代表狄利克雷卷积,先推式子. 对于给出的$n,x,y$求一百组数据的$ans$ $\begin{array}{rcl} ans & ...

  5. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  6. P2579 [ZJOI2005]沼泽鳄鱼(邻接矩阵,快速幂)

    题目简洁明了(一点都不好伐) 照例,化简题目 给一张图,每一个时间点有一些点不能走,(有周期性),求从起点第k秒恰好在终点的方案数,可重复,不可停留. 额dp实锤 于是就被打脸了.... 有一种东西叫 ...

  7. 代码托管服务平台GitHub

    GitHub 可以托管各种 git 库,并提供一个 Web 界面,但与其它像 SourceForge 或 Google Code 这样的服务不同,GitHub 的独特卖点在于从另外一个项目进行分支的简 ...

  8. python——多线程

    多线程特点: • 线程的并发是利用cpu上下文的切换(是并发,不是并行) • 多线程执行的顺序是无序的 • 多线程共享全局变量 • 线程是继承在进程里的,没有进程就没有线程 • GIL全局解释器锁 • ...

  9. 还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

    Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda ...

  10. 一个类GraphQL的ORM数据访问框架发布

    Zongsoft.Data 发布公告 很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广! 这是一个类 GraphQL 风格的  ...