drf框架 - 过滤组件 | 分页组件 | 过滤器插件
drf框架 接口过滤条件
群查接口各种筛选组件数据准备
models.py
- class Car(models.Model):
- name = models.CharField(max_length=16, unique=True, verbose_name='车名')
- price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
- brand = models.CharField(max_length=16, verbose_name='品牌')
-
- class Meta:
- db_table = 'api_car'
- verbose_name = '汽车表'
- verbose_name_plural = verbose_name
-
- def __str__(self):
- return self.name
admin.py
- admin.site.register(models.Car)
serializers.py
- class CarModelSerializer(serializers.ModelSerializer):
- class Meta:
- model = models.Car
- # 参与序列化的字段
- fields = ['name', 'price', 'brand']
views.py
- # Car的群查接口
- from rest_framework.generics import ListAPIView
-
- class CarListAPIView(ListAPIView):
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
urls.py
- url(r'^cars/$', views.CarListAPIView.as_view()),
drf过滤组件
搜索过滤组件 | SearchFilter
- 使用步骤:
- 1.导入搜索过滤器 SearchFilter
- 2.局部配置 filter_backends = [SearchFilter]
- 3.局部配置过滤类依赖的过滤条件(字段) search_fields = ['name', 'price'] 注意:依赖的过滤字段只能配置序列化类中fields里配置的字段
- 接口使用样式:
- /cars/?search=...
- # eg:/cars/?search=1,name和price中包含1的数据都会被查询出
案例:
views.py
- from rest_framework.generics import ListAPIView
-
- # 第一步:drf的SearchFilter - 搜索过滤
- from rest_framework.filters import SearchFilter
-
- class CarListAPIView(ListAPIView):
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
-
- # 第二步:局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
- filter_backends = [SearchFilter]
-
- # 第三步:SearchFilter过滤类依赖的过滤条件 => 接口:/cars/?search=...
- search_fields = ['name', 'price']
- # eg:/cars/?search=1,name和price中包含1的数据都会被查询出
排序过滤组件 | OrderingFilter
- 使用步骤:
- 1.导入搜索过滤 OrderingFilter
- 2.局部配置 filter_backends = [OrderingFilter]
- 3.局部配置过滤类依赖的过滤条件(字段) ordering_fields = ['pk', 'price']
- 接口使用样式:
- /cars/?ordering=...
- # eg:/cars/?ordering=-price,pk,先按price降序,如果出现price相同,再按pk升序
案例:
views.py
- from rest_framework.generics import ListAPIView
-
- # 第一步:drf的OrderingFilter - 排序过滤
- from rest_framework.filters import OrderingFilter
-
- class CarListAPIView(ListAPIView):
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
-
- # 第二步:局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
- filter_backends = [OrderingFilter]
-
- # 第三步:OrderingFilter过滤类依赖的过滤条件 => 接口:/cars/?ordering=...
- ordering_fields = ['pk', 'price']
- # eg:/cars/?ordering=-price,pk,先按price降序,如果出现price相同,再按pk升序
drf分页组件
自定义分页组件:
- 1.pahenations.py中自定义分页类(基础分页类/偏移分页类/游标分页类)
- 2.视图类中配置自定义的分页类: pagination_class = 自定义分页类
基础分页组件
pahenations.py
- from rest_framework.pagination import PageNumberPagination
-
- class MyPageNumberPagination(PageNumberPagination):
- # ?page=页码
- page_query_param = 'page'
- # ?page=页面 下默认一页显示的条数
- page_size = 3
- # ?page=页面&page_size=条数 用户自定义一页显示的条数
- page_size_query_param = 'page_size'
- # 用户自定义一页显示的条数最大限制:数值超过5也只显示5条
- max_page_size = 5
views.py
- from rest_framework.generics import ListAPIView
-
- class CarListAPIView(ListAPIView):
- # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
- # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可
- pagination_class = pagenations.MyPageNumberPagination
偏移分页组件
pahenations.py
- from rest_framework.pagination import LimitOffsetPagination
- class MyLimitOffsetPagination(LimitOffsetPagination):
- # ?offset=从头偏移的条数&limit=要显示的条数
- limit_query_param = 'limit'
- offset_query_param = 'offset'
- # ?不传offset和limit默认显示前3条,只设置offset就是从偏移位往后再显示3条
- default_limit = 3
- # ?limit可以自定义一页显示的最大条数
- max_limit = 5
-
- # 只使用limit结合ordering可以实现排行前几或后几
- # eg: ?ordering=-price&limit=2 => 价格前2
views.py
- from rest_framework.generics import ListAPIView
-
- class CarListAPIView(ListAPIView):
- # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
- # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可
- pagination_class = pagenations.MyLimitOffsetPagination
游标分页组件
pahenations.py
- # 注:必须基于排序规则下进行分页
- # 1)如果接口配置了OrderingFilter过滤器,那么url中必须传ordering
- # 1)如果接口没有配置OrderingFilter过滤器,一定要在分页类中声明ordering按某个字段进行默认排序
- from rest_framework.pagination import CursorPagination
- class MyCursorPagination(CursorPagination):
- cursor_query_param = 'cursor'
- page_size = 3
- page_size_query_param = 'page_size'
- max_page_size = 5
- ordering = '-pk'
views.py
- from rest_framework.generics import ListAPIView
-
- class CarListAPIView(ListAPIView):
- # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
- # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可
- pagination_class = pagenations.MyCursorPagination
自定义过滤类
源码:
- class GenericAPIView(views.APIView):
- ...
- # 配置过滤器路径
- filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
- ...
- def filter_queryset(self, queryset):
- # 若自己的视图列中配置了filter_backends=[过滤类] 就走视图类中的
- for backend in list(self.filter_backends):
- # 当时视图类中配置了filter_backends=[过滤类]
- # 下面这步会调用我们自己定义的过滤类的filter_queryset方法
- queryset = backend().filter_queryset(self.request, queryset, self)
- return queryset
使用:
- # 1.自定义过滤类,重写filter_queryset方法
- # 2.在视图类中配置filter_backends = [自定义过滤类]
补充:
自定义过滤类不需要继承GenericAPIView,因为视图类继承了ListAPIView, ListAPIView本来就继承GenericAPIView
我们自定义的过滤类要在视图类中配置,当源码中的GenericAPIView要调用过滤类时就会调用我们在视图类中配置的自定义过滤类,从而调用filter_query方法
filters.py
- class LimitFilter:
- # 重写filter_queryset方法
- def filter_queryset(self, request, queryset, view):
- # 从get请求中获取limit的值
- limit_mun = request.query_params.get('limit')
- if limit_mun:
- limit_mun = int(limit_mun)
- # 将queryset列表按limit_num切分
- return queryset[:limit_mun]
- return queryset
views.py
- from rest_framework.generics import ListAPIView
-
- class CarListAPIView(ListAPIView):
- # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
- # 局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
- filter_backends = [LimitFilter]
过滤器插件:django-filter
安装
- >: pip3 install django-filter
过滤条件层:自定义api/filters.py
- from django_filters.rest_framework.filterset import FilterSet
- from . import models
- from django_filters import filters
-
- class CarFilterSet(FilterSet):
- # 自定义过滤字段
- max_price = filters.NumberFilter(
- field_name='price', # 该自定义字段关联的model类表中的字段
- lookup_expr='gte', # 查找的条件 'gte':大于等于
- )
- min_price = filters.NumberFilter(
- field_name='price', # 该自定义字段关联的model类表中的字段
- lookup_expr='lte', # 查找的条件 'lte':小于等于
- )
- class Meta:
- model = models.Car
- fields = ['brand', 'min_price', 'max_price']
- # brand是model中存在的字段,一般都是可以用于分组的字段
- # min_price、max_price是自定义字段,需要自己自定义过滤条件
视图层:views.py
- # django-filter插件过滤器
- from django_filters.rest_framework import DjangoFilterBackend
- from .filters import CarFilterSet
-
- class CarListAPIView(ListAPIView):
- queryset = models.Car.objects.all()
- serializer_class = serializers.CarModelSerializer
- # 局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
- filter_backends = [DjangoFilterBackend]
- # django-filter过滤器插件使用
- filter_class = CarFilterSet
- # 接口:?brand=...&min_price=...&max_price=...
- # eg:?brand=宝马&min_price=5&max_price=10 => 5~10间的宝马牌汽车
drf框架 - 过滤组件 | 分页组件 | 过滤器插件的更多相关文章
- drf-过滤组件|分页组件|过滤器
目录 drf-过滤组件|分页组件|过滤器 群查接口各种筛选组件数据准备 drf过滤组件 搜索过滤组件 | SearchFilter 案例: 排序过滤组件 | OrderingFilter 案例: dr ...
- DRF框架之 serializers 序列化组件
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...
- 电子商务系统的设计与实现(十):DWZ框架与第三方分页组件整合
晚上,就是刚刚,在后端管理系统中使用DWZ框架. 先是,直接使用官网网站的Demo,dwz-jui,与编程语言无关的纯静态的那个原始项目. 很快就搭建好了左侧菜单,打开菜单后,出现Tab页面,然后显示 ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- DRF之注册响应分页组件
注册器 注册器的作用就是以后我们不用自己手动的一条条的敲路径了,它可以帮助哦们直接去找对应的路由,不用传参了,知道这一点就可以了,不多说还是,上代码实例 第一步:导入模块from django.url ...
- DRF框架(七) ——三大认证组件之频率组件、jwt认证
drf频率组件源码 1.APIView的dispatch方法的 self.initial(request,*args,**kwargs) 点进去 2.self.check_throttles(re ...
- 【DRF框架】利用序列化组件操作
使用序列化组件进行操作 不带参数:查+增 带参数:查.改.删 不带参数的操作 # url路由 url(r'^book_list/$',Search_book.as_view()), # views.p ...
- DRF之过滤排序分页异常处理
一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...
- 【DRF框架】视图组件
基于mixins视图类 from rest_framework import mixins # 创建视图 class CreateModelMixin(object) def create(self, ...
随机推荐
- 系统中提示未找到/usr/bin/ld: cannot find -lxxx错误的通用解决方法
在linux环境编译应用程式或lib的source code时常常会出现如下的错误讯息: 代码如下: /usr/bin/ld: cannot find -lxxx 这些讯息会随着编译不同类型的sour ...
- 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 原生js监听input值发生变化
原生JS中可以使用oninput,onpropertychange,onchange oninput,onpropertychange,onchange的用法 1) onchange 触发事件必须满足 ...
- 不借助其他任何软件防止QQ被盗的小技巧
分享一个小技巧(防止QQ被盗号): 在登录的时候前面加个0,点击登录,如果显示账号不存在,是因为你没有在添加或注册账号这儿登录,也就是切换账号.PC端也可以,如下图: ...
- 下载 m3u8 直播流的方法
下载 FFmpeg http://ffmpeg.org/download.html 查找直播流地址 找到目标视频对应的 m3u8 播放列表. 执行脚本 ffmpeg -i https://nhkmov ...
- [CMD] 批处理
https://www.tutorialspoint.com/batch_script/batch_script_commands.htm
- git stash详解
应用场景: 1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然 ...
- springboot2.1.7整合swagger2.9.2
什么是swagger? swagger是用于定义API文档的一个框架. 为什么要使用swagger? 当下项目开发时前后端是分离的,那么接口就成了前后端唯一的纽带.前端工程师如何知道哪个接口是干嘛的? ...
- xorm-创建时间created
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/ ...
- springboot项目 配置https
感谢 https://www.jianshu.com/p/1b7b9e0803c6 帮我解决了问题 生成自签名证书 keytool -genkey -storetype PKCS12 -keysiz ...