Django分页,过滤:
15.1 分页
分页模式
rest framework中提供了三种分页模式:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
全局配置
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 100
}
局部配置
15.1.2 drf局部分页设置
在视图中指明自定义的分页类
# HeroListCreateAPIView/?page=2&size=2 查询第2页,每页2条的英雄信息
class HeroListCreateAPIView(ListCreateAPIView):queryset = Hero.objects.all() # 查询集serializer_class = HeroModelSerializer # 自己定义的序列化器# 没有指明分页类,会按照全局分页pagination_class = Pagination # 使用自定义的分页类
15.1.3 drf自定义分页类对象重写分页属性
自定义分页类,实现属性的重写
# 只有某些视图,需要分页, 可以自定义分页类
class Pagination(PageNumberPagination):page_size = 1 # 每页数量max_page_size = 3 # 每页最大的数量 以访特殊情况写不写都行page_size_query_param = 'size' # 每页数量的参数名 供前端使用的page_query_param = 'page' # 页码的参数名2
我们还可以在视图类中进行这样的局部设置
class PublisherViewSet(ModelViewSet):queryset = models.Publisher.objects.all()serializer_class = PublisherModelSerializerpagination_class = PageNumberPagination # 注意不是列表(只能有一个分页模式)
DRF内置分页器
1、PageNumberPagination
按页码数分页,第n页,每页显示m条数据,例如:http://127.0.0.1:8000/api/article/?page=2&size=1
分页器
# 重写
class MyPageNumber(PageNumberPagination):page_size = 2 # 每页显示多少条page_size_query_param = 'size' # URL中每页显示条数的参数page_query_param = 'page' # URL中页码的参数max_page_size = None # 最大页码数限制# 如果我要的数据是第一页显示10条: http://127.0.0.1:8000/books/?size=10&page=1
# 如果我要的是第二页显示5条: http://127.0.0.1:8000/books/?size=5&page=2
# max_page_size = 8 :控制最大显示多少条如果我想第一页显示10000条,这种不合理,通过这个参数控制,最大显示8条
视图
class ArticleList(APIView):def get(self, request, *args, **kwargs):res = {"code": 0}article_list = models.Article.objects.all().order_by("id")# 分页page_obj = MyPageNumber()page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)ser_obj = ArticleSerializer(page_article, many=True)res["data"] = ser_obj.datareturn Response(res)
返回带页码链接的响应
class ArticleList(APIView):def get(self, request, *args, **kwargs):res = {"code": 0}article_list = models.Article.objects.all().order_by("id")# 分页page_obj = MyPageNumber()page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)ser_obj = ArticleSerializer(page_article, many=True)res["data"] = ser_obj.datareturn page_obj.get_paginated_response(res)
2、LimitOffsetPagination
分页,在n位置,向后查看m条数据,例如:http://127.0.0.1:8000/api/article/?offset=2&limit=2
分页器
# offset分页
class MyLimitOffset(LimitOffsetPagination):default_limit = 5 # 默认偏移的条数 5limit_query_param = 'limit' # 偏移的条数offset_query_param = 'offset' # 从哪开始偏移max_limit = 999 # 偏移的最大条数-http://127.0.0.1:8000/books/ 结果是:从1到5
-http://127.0.0.1:8000/books/?limit=7 结果是:从1到7
-http://127.0.0.1:8000/books/?limit=2&offset=6 结果是:从7到8,两条
-http://127.0.0.1:8000/books/?offset=6 结果是:从7到11,5条
视图
class ArticleList(APIView):def get(self, request, *args, **kwargs):res = {"code": 0}article_list = models.Article.objects.all().order_by("id")# 分页page_obj = MyLimitOffset()page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)ser_obj = ArticleSerializer(page_article, many=True)res["data"] = ser_obj.datareturn page_obj.get_paginated_response(res)
3、CursorPagination
加密分页,把上一页和下一页的id值记住
分页器
# 加密分页
class MyCursorPagination(CursorPagination):cursor_query_param = 'cursor'page_size = 1 # 每页显示的条数ordering = '-id' # 按谁排序
视图
class ArticleList(APIView):def get(self, request, *args, **kwargs):res = {"code": 0}article_list = models.Article.objects.all().order_by("id")# 分页page_obj = MyCursorPagination()page_article = page_obj.paginate_queryset(queryset=article_list, request=request, view=self)ser_obj = ArticleSerializer(page_article, many=True)res["data"] = ser_obj.data# return Response(res)return page_obj.get_paginated_response(res)
15.2 过滤
15.2.1 django-filter的精准过滤
安装插件
该django-filter库包含一个DjangoFilterBackend
类,该类支持针对REST框架的高度可自定义的字段筛选。
要使用
DjangoFilterBackend
,请先安装django-filter
。
pip install django-filter
注册APP
添加
'django_filters'
到Django的INSTALLED_APPS
:
INSTALLED_APPS = [...'django_filters',...
]
配置过滤引擎
将过滤器后端添加到全局设置中:
REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
或将过滤器后端添加到单个View
或ViewSet
。
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.generics import ListAPIViewclass GoodsListAPIView(ListAPIView):...filter_backends = (DjangoFilterBackend,)
如果只需要简单的基于模型类字段的等式过滤,则可以filterset_fields
在视图或视图集上设置一个属性,列出要过滤的字段集。
class GoodsListAPIView(ListAPIView):queryset = GoodsModel.objects.all()serializer_class = GoodsModelSerializer# filter_backends = (DjangoFilterBackend, ) # 如果全局设置过,局部不需要设置filter_fields = ('price', 'name')
FilterSet
将自动为给定的字段创建一个类,并允许您发出如下请求:
http://127.0.0.1:8000/api/goods/?price=5&name=西瓜
15.2.2 django-filter的模糊过滤
自定义过滤器,实现高级过滤
class GoodsFilter(django_filters.rest_framework.FilterSet):"""商品的过滤类"""min_price = django_filters.NumberFilter(field_name="price",lookup_expr="gte")# field_name 表示要过滤字段;lookup_expr 表示 过滤时要进行的操作,gte 表示 大于等于max_price = django_filters.NumberFilter(field_name="price", lookup_expr="lte") # lte 小于等于name = django_filters.CharFilter(field_name="name", lookup_expr="icontains") # icontains 表示 包含(忽略大小写)class Meta:model = GoodsModel # 关联的表fields = ["min_price", "max_price", "name"] # 过滤的字段class GoodsListAPIView(ListAPIView):queryset = GoodsModel.objects.all()serializer_class = GoodsModelSerializer filterset_class = GoodsFilter # 指明过滤器类
FilterSet
将自动为给定的字段创建一个类,并允许您发出如下请求:
http://127.0.0.1:8000/api/goods/?max_price=50&name=瓜
15.2.3 rest_framework的SearchFilter
该搜索引擎依赖于
rest_framework
, 不需要安装额外的插件
配置搜索引擎
将过滤器后端添加到全局设置中:
REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.SearchFilter']
}
或将过滤器后端添加到单个
View
或ViewSet
。
from rest_framework.filters import SearchFilter
from rest_framework.generics import ListAPIViewclass GoodsListAPIView(ListAPIView):...filter_backends = [SearchFilter]
配置搜索字段
from rest_framework.filters import SearchFilter
from rest_framework.generics import ListAPIViewclass GoodsListAPIView(ListAPIView):...search_fields = ['name']
这将允许客户端通过执行以下查询来过滤列表中的项目:
http://127.0.0.1:8000/api/goods/?search=西瓜汁
您还可以使用查找API双下划线表示法在ForeignKey或ManyToManyField上执行相关查找:
search_fields = ['name', 'cate__name']
默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索词,应将其用空格或逗号分隔。如果使用多个搜索词,则仅当所有提供的词都匹配时,对象才会在列表中返回。
可以通过在字符前面添加各种字符来限制搜索行为search_fields
。
'^'
开始搜索'='
完全匹配'$'
正则表达式搜索
模糊搜索和排序 代码实现:
pip install django-filter
# settings配置 注册一下INSTALLED_APPS = ['django_filters',
]
# 序列化器class ShopSer(serializers.ModelSerializer):# 如有外键,当声明 可供搜索使用# kind = serializers.StringRelatedField(read_only=True)class Meta:model = Shopfields = '__all__'
#视图from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter, SearchFilterclass ShopFunction(ListAPIView):queryset = Shop.objects.all()serializer_class = ShopSerfilter_backends = [OrderingFilter, SearchFilter]search_fields = ['id', 'name'] # 如有外键kind_id,即为'kind__id'ordering_fields = ['id']
# 路由 主路由为shop/from django.urls import pathfrom shop import viewsurlpatterns = [path('shopfunction/', views.ShopFunction.as_view()),
]
# 前端请求# http://127.0.0.1:8000/shop/shopfunction/?search=鸡排let url = 'shop/shopfunction/?search=' + this.name
get(url)# http://127.0.0.1:8000/shop/shopfunction/?ordering=-idlet url = 'shop/shopfunction/?ordering=-id'
get(url)
Django分页,过滤:相关推荐
- 2019.03.20 mvt,Django分页
MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...
- 第八篇Django分页
Django分页 1.复杂版 data = []for i in range(1, 302):tmp = {"id": i, "name": "ale ...
- Django 分页查询并返回jsons数据,中文乱码解决方法
Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...
- django ajax 查询,Django分页和Ajax查询
在Django中,实现分页以在多个页面上显示查询项目是非常简单的.使用Ajax仅更新实际发生更改的页面位,而不是每次加载整个页面也是非常直接的.但是,当我们将两者结合在一起时,我发现它有点问题.Dja ...
- Django分页+增删改查
Django分页+增删改查 演示 源码下载地址:https://download.csdn.net/download/qq_35622606/87719248 其他小笔记: django-admin. ...
- django分页实现
Django分页 Django提供了一个类Paginator用于分页,但Paginator并不具体管理具体的页的处理,而是使用Page对象管理具体页面.下面我们以一个具体的例子来说明一下分页的实现 文 ...
- django分页查询
Django分页查询(整合vue) 一.django部分 在view.py里添加分页查询方法 from django.http import JsonResponse from django.view ...
- django分页功能 views与templates
分页 Django提供了数据分页的类,这些类被定义在django/core/paginator.py中 对象Paginator用于对列进行一页n条数据的分页运算 对象Page用于表示第m页的数据 Pa ...
- 17. django分页
分页 Django提供Paginator类来实现分页功能,它位于django.core.paginator 模块中 Paginator Paginator它负责分页数据整体的管理. 语法参数 对象的构 ...
最新文章
- SharpDevelop
- 精度 vs 效率:模型越小,精度就一定越低吗?
- Git 同一个Git HostName 配置多个sshkey
- Winform中实现右下角Popuo弹窗提醒效果(附代码下载)
- firefox 开发sdk
- unity官方教程-TANKS(一)
- Android Webservices 返回多行多列数据(Dataset)
- Spark : ExitCodeException exitCode=15,exitCode=13
- c语言解三元一次方程组_在R里面对三元一次方程求解
- api es7 删除所有数据_男子让月薪6万的人技术入股,结果工作3月蒙了:删除所有数据入职其他公司...
- 如何用PS软件取得色块的颜色值?
- HDU 1022 Train Problem I stack 基础题
- 不要让SOA控制我们的思想
- ORACLE SQL*PLUS
- 数据挖掘期末论文要求
- MOSEK Fusion Model
- php调京东联盟接口,使用京东联盟API获取自定义促销链接
- STM32 VCP PC端安装驱动失败的问题解决
- PHP中xml转json
- DevExpress中实现给GridControl下的GridView表格修改指定行、列的背景颜色和获取选择行的信息
热门文章
- 两年数模路,一点小感触…
- mount point / 挂载点
- 拉格朗日插值验证龙格现象python
- Linux内核编程接口函数
- http://sishuok.com/forum/blog/index.html?search_keywords=%E7%A0%94%E7%A3%A8%E8%AE%BE%E8%AE%A1%E6%A8%
- 机器人兴趣班奖状_拼音兴趣班奖状导师寄语
- [BUU刷题记录]day01-起步
- 工作四年,分享15个对Java 程序员有用的库
- layui 卡片式列表_CardView實現卡片式列表展示
- 阿里巴巴与蚂蚁集团开源框架SOFA Boot