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']
}

或将过滤器后端添加到单个ViewViewSet

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']
}

或将过滤器后端添加到单个ViewViewSet

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分页,过滤:相关推荐

  1. 2019.03.20 mvt,Django分页

    MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应. T全拼为T ...

  2. 第八篇Django分页

    Django分页 1.复杂版 data = []for i in range(1, 302):tmp = {"id": i, "name": "ale ...

  3. Django 分页查询并返回jsons数据,中文乱码解决方法

    Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...

  4. django ajax 查询,Django分页和Ajax查询

    在Django中,实现分页以在多个页面上显示查询项目是非常简单的.使用Ajax仅更新实际发生更改的页面位,而不是每次加载整个页面也是非常直接的.但是,当我们将两者结合在一起时,我发现它有点问题.Dja ...

  5. Django分页+增删改查

    Django分页+增删改查 演示 源码下载地址:https://download.csdn.net/download/qq_35622606/87719248 其他小笔记: django-admin. ...

  6. django分页实现

    Django分页 Django提供了一个类Paginator用于分页,但Paginator并不具体管理具体的页的处理,而是使用Page对象管理具体页面.下面我们以一个具体的例子来说明一下分页的实现 文 ...

  7. django分页查询

    Django分页查询(整合vue) 一.django部分 在view.py里添加分页查询方法 from django.http import JsonResponse from django.view ...

  8. django分页功能 views与templates

    分页 Django提供了数据分页的类,这些类被定义在django/core/paginator.py中 对象Paginator用于对列进行一页n条数据的分页运算 对象Page用于表示第m页的数据 Pa ...

  9. 17. django分页

    分页 Django提供Paginator类来实现分页功能,它位于django.core.paginator 模块中 Paginator Paginator它负责分页数据整体的管理. 语法参数 对象的构 ...

最新文章

  1. SharpDevelop
  2. 精度 vs 效率:模型越小,精度就一定越低吗?
  3. Git 同一个Git HostName 配置多个sshkey
  4. Winform中实现右下角Popuo弹窗提醒效果(附代码下载)
  5. firefox 开发sdk
  6. unity官方教程-TANKS(一)
  7. Android Webservices 返回多行多列数据(Dataset)
  8. Spark : ExitCodeException exitCode=15,exitCode=13
  9. c语言解三元一次方程组_在R里面对三元一次方程求解
  10. api es7 删除所有数据_男子让月薪6万的人技术入股,结果工作3月蒙了:删除所有数据入职其他公司...
  11. 如何用PS软件取得色块的颜色值?
  12. HDU 1022 Train Problem I stack 基础题
  13. 不要让SOA控制我们的思想
  14. ORACLE SQL*PLUS
  15. 数据挖掘期末论文要求
  16. MOSEK Fusion Model
  17. php调京东联盟接口,使用京东联盟API获取自定义促销链接
  18. STM32 VCP PC端安装驱动失败的问题解决
  19. PHP中xml转json
  20. DevExpress中实现给GridControl下的GridView表格修改指定行、列的背景颜色和获取选择行的信息

热门文章

  1. 两年数模路,一点小感触…
  2. mount point / 挂载点
  3. 拉格朗日插值验证龙格现象python
  4. Linux内核编程接口函数
  5. http://sishuok.com/forum/blog/index.html?search_keywords=%E7%A0%94%E7%A3%A8%E8%AE%BE%E8%AE%A1%E6%A8%
  6. 机器人兴趣班奖状_拼音兴趣班奖状导师寄语
  7. [BUU刷题记录]day01-起步
  8. 工作四年,分享15个对Java 程序员有用的库
  9. layui 卡片式列表_CardView實現卡片式列表展示
  10. 阿里巴巴与蚂蚁集团开源框架SOFA Boot