drf过滤器、分页器、筛选器的应用
一、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过滤器、分页器、筛选器的应用的更多相关文章
- ASP.NET MVC 如何使用自定义过滤器(筛选器)
继承*****Attribute(筛选器三种具体类)-->重写方法-->标记在控制器 或者 方法上面 或者 在FilterConfig中Add [类名(类属性 = 值)]还有[AllowA ...
- MVC四大筛选器—ActionFilter&ResultedFilter
AuthorizeFilter筛选器 在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向 ...
- asp.net core 2.2 中的过滤器/筛选器(上)
ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...
- ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序
FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true protecte ...
- mvc 筛选器
之前公司中,运用ActionFilterAttribute特性实现用户登录信息的验证,没事看了看,留下点东西备忘. 好的,瞅这玩意一眼就大概能猜到这货是干嘛的了吧,没错,action过滤器.其实就是A ...
- 基础教程:ASP.NET Core 2.0 MVC筛选器
问题 如何在ASP.NET Core的MVC请求管道之前和之后运行代码. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServi ...
- Asp.net Web Api添加异常筛选器
一.定义一个异常筛选器 using System;using System.Collections.Generic;using System.Linq;using System.Web;using S ...
- 绕过基于签名的XSS筛选器:修改HTML
绕过基于签名的XSS筛选器:修改HTML 在很多情况下,您可能会发现基于签名的过滤器只需切换到一个不太熟悉的执行脚本的方法即可.如果失败了,您需要查看混淆攻击的方法. 本文提供了HTML语法可以被混淆 ...
- 过滤器,拦截器,aop区别与使用场景
1. 什么是过滤器 过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中 ...
随机推荐
- CVE-2019-0708复现之旅
CVE-2019-0708 0x00 前言: CVE-2019-0708漏洞已经出来三四个月了对应的poc也出现了很久 ,exp 还是没动静前段时间出了个蓝屏伪exp 不过肯定那些大厂手里早已经了有了 ...
- 【XSY1986】【BZOJ1455】罗马游戏
就是一模板题. 合并就直接merge. pop就是将自己的值设为一,再将自己的左右儿子合并即可. 查询直接找到堆顶,输出. 模板左偏树 代码: #include<bits/stdc++.h> ...
- [考试反思]1107csp-s模拟测试104: 速度
20分钟能做什么? 不粘排行榜,没意义,第一机房集体重启,我侥幸找回了两个文件才有分. 实际得分应该是70+100+60,第二机房rank1...放在第一机房就不知道了 T1:中间值 比较喜欢题解的第 ...
- [考试反思]1026csp-s模拟测试89:不公
稍垃圾.因为T1没A. 赶巧前一段时间学了杜教筛,结果因为教练放错题. 然后考场上疯狂yy,最后水到了一个AC. 其实的确挺不公平的,不少人也没学呢. 如果只算T1和T3的分数的话,那70分就是个垃圾 ...
- [考试反思]0917csp-s模拟测试45:天命
又倒一了. 关于心态,有不少想说的. 首先旁边坐了一个kx.他上来入手T1没多久就切了然后开始对拍拍了几十万组AC. 然而我觉得T1是神仙题.先进T2. 挺简单的,5分钟出正解,然后在打出来的时候突然 ...
- [考试反思]0825NOIP模拟测试30:没落
AB卷,15人. Lrefrain rank#1 179 skyh rank#2 122 116 108 54 42虽说还是不怎么样,但是有好转的迹象. 开卷审题,T1是个(假)期望,感觉也许还可做. ...
- Android Studio接谷歌原生登录
目录 前言 AndroidStudio server_client_id @ 前言 准备 近日,公司要求上线海外市场,需要接入海外SDK,首先上架的是GooglePlay,需要先接入GooglePla ...
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- 130道ASP.NET面试题(二)
71.什么是反射?答:动态获取程序集信息 72.用Singleton如何写设计模式答:static属性里面new ,构造函数private 73.什么是Application Pool?答:Web应用 ...
- java编程思想第四版第十三章字符串 习题
fas 第二题 package net.mindview.strings; import java.util.ArrayList; import java.util.List; /** * 无限循环 ...