django: rest-framework的 分页和过滤

2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdjango 更多

 
版权声明:尊重版权, 从你做起 https://blog.csdn.net/weixin_42359464/article/details/80838997

http://blog.wktadmin.com

一. 分页

二. 过滤


一. 分页

rest-framework查询时候默认是不分页的, 除了手动计算查询的起始位置之外, rest-framework也提供了一些页码的设置功能.

  1. 方式1: 直接在setting里添加配置

在settings中rfw(rest-framework)的所有设置都在REST_FRAMEWORK字典中,(如果不设置将采用rfw的默认设置, 默认设置存放在rest-framework.settings中, 可以在此处查询设置的字段名, 防止拼写错误), 我们修改项目目录下的settings.py

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10 # 这是每页显示的数目
}
  • 1
  • 2
  • 3
  • 4

完毕 
此时通过restframe查询之时, 将以每页十条数据显示. 这种方式及其简单, 但是无法对url的页码参数进行’个性化’定制

  • 方式2: 自定义分页(类):

自定义类需要重写PageNumberPagination, 可以自定义多个参数

from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'size'
page_query_param = 'p'
max_page_size = 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

重写后只需在类视图中指定即可


class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
goods list
"""
...
pagination_class = StandardResultsSetPagination
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

此时的url变为:

http://localhost:8000/books/?p=3&size=3
  • 1

二. 过滤

  • 方式1: 简单设置

直接在视图指定filter_backends可以快速实现过滤的功能

from django_filters.rest_framework import DjangoFilterBackend
class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
goods list
"""
...
filter_backends = (DjangoFilterBackend, ) # 过滤
filter_fields = ('name', 'shop_price') # 过滤的字段
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

此时通过浏览器访问, 右上角谁多出一个过滤器按钮, 点击即可过滤:

但是值得注意的是, 这种过滤方式不支持任何模糊搜索的, 必须完全一致才可以匹配到结果. 
过滤时的url格式为

http://localhost:8000/books/?name=namss&shop_price=30
  • 1
  • 方式2: 自定义过滤器类

为了实现模糊搜索, 可以设置一个自定义的过滤器类, 并在视图中完成指定. 
比如过滤价格区间:

import django_filters
from .models import Goods
class ProductFilter(django_filters.rest_framework.FilterSet):
'''商品的过滤类'''
# 比如此处我们进行价格的过滤
price_min = django_filters.NumberFilter(name="shop_price", lookup_expr='gte')
price_max = django_filters.NumberFilter(name="shop_price", lookup_expr='lt') class Meta:
model = Goods
fields = ['price_min', 'price_max'] # 使之生效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

当然, 也需要到视图中指定filter_class

from django_filters.rest_framework import DjangoFilterBackend
class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
goods list
"""
...
filter_backends = (DjangoFilterBackend, ) # 过滤
# 自定义的过滤
filter_class = ProductFilter
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

django: rest-framework的 分页和过滤的更多相关文章

  1. Django Rest framework 之 分页

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  2. django rest framework实现分页功能

    在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...

  3. Django rest framework 之分页

    Django rest_framework 中分页可分为三类: PageNumberPagination:看第 n 页,每页显示 n 条数据 LimitOffsetPagination:在 n 个位置 ...

  4. Django REST framework的分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...

  5. Django REST framework 之分页,视图,路由,渲染器

    1.分页 2.视图 3.路由 4.渲染器 1.分页 方法一: from django.shortcuts import render from rest_framework.versioning im ...

  6. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  7. Django Rest framework 之 解析器

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  8. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  9. Django Rest framework 之 节流

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  10. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

随机推荐

  1. 洛谷 P3015 [USACO11FEB]最好的括号Best Parenthesis

    传送门 题目大意:给出括号的得分标准. ()得分为1,如果A的得分为S(A),那么 (A)的得分为2*S(A). 题解:搜索 #include<iostream> #include< ...

  2. jQuery火箭图标返回顶部代码

    在网上找来段使用jQuery火箭图标返回顶部代码,感觉比较酷,比较炫,大概样式如下, 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  3. php 日期时间运算比较

    $sql= "select * from t_datestudy where id='4750' and agreemode='2' and school_agree !='1'" ...

  4. android 中管理短信

    为了看代码方便,一边在网上google资料,一边看Android java 源代码. 偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mm ...

  5. Linux 安装交叉编译工具链

    交叉编译工具链下载地址: 链接:http://pan.baidu.com/s/1dE7P9rb 密码:300i 声明:下面每一步中的“pwd”指令都是为了看清楚当前的目录,没有其他实际意义. 系统:u ...

  6. java数组复制的简单方法(一)

    总结:主要是用a数组的长度等于b数组,然后a数组赋值给b数组,我不能想到这个办法,我还是不理解数组中length属性的含义 这里数组并没有正真复制过来,而是一个引用 package com.a; // ...

  7. 关于ESXI能虚拟出多少个虚拟机和CPU的关系

    当你的虚拟机报如下错误的时候: esxi5.0版本最高配置: https://www.vmware.com/content/dam/digitalmarketing/vmware/zh-cn/pdf/ ...

  8. 2014.8.8 CAD系统连接

    CDA数据库连接生产库.研发库.临时库对应3个连接名 cad = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = backupserver)(POR ...

  9. 优化深度神经网络(一) dropout 初始化

    Coursera吴恩达<优化深度神经网络>课程笔记(1)-- 深度学习的实用层面 1. Train/Dev/Test sets  训练集(Training sets).验证集(Develo ...

  10. maven项目引入外部jar包的三种方式

    方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud</groupId> <!--自定义--& ...