当前位置: 首页 > news >正文

DRF之过滤,排序,分页

一、权限组件源码解读

1.继承了APIView

才有的---》执行流程---》dispatch中----》三大认证

APIView的dispatch  

def initial(self, request, *args, **kwargs):self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request)

2 读权限:APIView的方法

self.check_permissions(request)def check_permissions(self, request):# permission_classes = [AdminPermission]# self.get_permissions()我们配置再视图类上permission_classes列表中的认证类,一个个的对象# self.get_permissions()  是  [AdminPermission(),]for permission in self.get_permissions():# 写的权限类,要重写has_permission方法# 猜permission是我们写的权限类的对象# self 是视图类的对象(BookView,PublisViwe)if not permission.has_permission(request, self): # 权限没通过self.permission_denied(request,# self.message 错误文字message=getattr(permission, 'message', None),code=getattr(permission, 'code', None))

3 读 APIView--->self.get_permissions

def get_permissions(self):return [permission() for permission in self.permission_classes]# 翻译:l=[]for permission in self.permission_classes:l.append(permission())return l

记住:

- 写的权限类,一定要写一个方法has_permission,返回True或False
    - 配置再视图类上

4.补充

视图类的方法,必须返回 4件套或drf的Response

return和raise完全不一样

视图类继承了

视图类:ViewSetMixin,ListModelMixin----》查询所有好多代码不用写----》可以自动生成路由router.register('book',BookView,'book')/book/--->get请求过来被映射了 list---》执行视图类中的list----》BookView中写了get方法,根本不会执行自动生成路由

二、认证源码分析

继承了APIView,才有的---》执行流程---》dispatch中----》三大认证

1  APIView的dispatch

self.initial(request, *args, **kwargs)def initial(self, request, *args, **kwargs):self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request)

2 self.perform_authentication(request)

def perform_authentication(self, request):request.user  # 这是个方法,包装成了数据属性

3 Request类的user

@propertydef user(self):if not hasattr(self, '_user'):with wrap_attributeerrors():self._authenticate()return self._user

4 Request类的self._authenticate()

def _authenticate(self):# self.authenticators 就是你写的认证类列表---》列表推导式---》[LoginAuth(),]for authenticator in self.authenticators:try:user_auth_tuple = authenticator.authenticate(self)except exceptions.APIException:# 抛了异常被捕获了if user_auth_tuple is not None:# 如果返回了两个值,就会执行这句话# self是Request的对象self.user, self.auth = user_auth_tuplereturnself._not_authenticated()

5 Request类初始化

APIView---》dispathc的前面

总结:

1 认证类,必须写一个方法authenticate2 如果认证通过,可以返回None,也可也返回两个值,但是第一个值,尽量是当前登录用户,第二个值一般放token3 认证失败,抛异常AuthenticationFailed,继承了APIException,他能捕获

三、django中的翻译函数

只要做了国际化,会自动翻译成,当前国家的语言

from django.utils.translation import gettext_lazy as _
_('hello')

四、过滤

restful规范中
    -请求地址中带过滤条件

带过滤的接口只有:查询所有

1.内置过滤类

from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from .models import Book
from rest_framework.filters import SearchFilter# 内置过滤类
class BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer
# 支持这种搜索
# http://127.0.0.1:8000/api/v1/books/?search=红
#     search_fields = ['name']
# http://127.0.0.1:8000/api/v1/books/?search=11  只要name或price中带11都能搜出来filter_backends = [SearchFilter]search_fields = ['name']

2.第三方过滤类

from django_filters.rest_framework import DjangoFilterBackend第三方过滤类
class BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 按名字和价格精准匹配# http://127.0.0.1:8000/api/v1/books/?name=红楼梦&price=45filter_backends = [DjangoFilterBackend]filterset_fields = ['name', 'price']

3.自定义过滤类

views:

from .filter import MyFilter自定义过滤类
class BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 返回的数据,就是过滤后的数据# http://127.0.0.1:8000/api/v1/books/?name=三国演义&price=25   按名字或价格filter_backends = [MyFilter]filterset_fields = ['name', 'price']

 filter:

from rest_framework import filters
from django.db.models import Qclass MyFilter(filters.BaseFilterBackend):def filter_queryset(self, request, queryset, view):price = request.query_params.get('price')name = request.query_params.get('name')# 返回的数据,就是过滤后的数据# http://127.0.0.1:8000/api/v1/books/?price=44&name=红楼梦# 按名字或价格queryset = queryset.filter(Q(name=name) | Q(price=price))return queryset

小练习:区间过滤

取出价格在100-200元之间的书

views:

# 自定义过滤价格在一百到两百之间的图书
from .filter import BookFilterSet
from rest_framework.filters import SearchFilterclass BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [BookFilterSet]search_fields = ['price']

filter:

# 自定义过滤价格在一百到两百之间的图书from rest_framework import filters
from .models import Bookclass BookFilterSet(filters.BaseFilterBackend):def filter_queryset(self, request, queryset, view):price = request.query_params.get('price')min_price = request.query_params.get('min_price')max_price = request.query_params.get('max_price')queryset = queryset.filter(price__gt=min_price, price__lt=max_price)return queryset

过滤和排序可以一起使用:

例:

url:

from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import SimpleRouter
from app01 import viewsrouter = SimpleRouter()
# 图书路由
# router.register('books', views.BookView, 'book')
# 出版社路由
# router.register('publishes', views.PublishView, 'publish')urlpatterns = [path('admin/', admin.site.urls),path('api/v1/', include(router.urls)),
]

views:

from .models import Publish
from .serializer import PublishSerializer
from rest_framework.filters import OrderingFilter
from .page import PublishPageNumberPaginationclass PublishView(GenericViewSet, ListModelMixin):queryset = Publish.objects.all()serializer_class = PublishSerializerfilter_backends = [SearchFilter, OrderingFilter]search_fields = ['title', 'addr']ordering_fields = ['id']pagination_class = PublishPageNumberPagination

page:

class PublishPageNumberPagination(PageNumberPagination):page_size = 1page_size_query_param = 'page_size'page_query_param = 'page'max_page_size = 5

五排序

restful规范中
    -请求地址中带过滤条件

排序功能的接口:查询所有

排序
from rest_framework.filters import OrderingFilterclass BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 排序类# http://127.0.0.1:8000/api/v1/books/?ordering=pricefilter_backends = [OrderingFilter]ordering_fields = ['price']

六 分页

查询所有接口,过滤和排序了,但是实际上,这个接口,都需要有分页功能

-分页的展现形式
        web:下一页点解
        app,小程序:下滑下一页
    -接口都一样,要支持分页

drf提供给咱们,三种分页方式:


1.基本分页(用的较多)

views:

class BookView(GenericViewSet, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializer# 基本分页# http://127.0.0.1:8000/api/v1/books/?page=2&page_size=3pagination_class = MyPageNumberPagination  # 基本分页

 page:

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination# 基本分页
class MyPageNumberPagination(PageNumberPagination):# 重新几个类属性 :4个page_size = 2  # 每页的显示条数page_query_param = 'page'  # page=4表示第4页page_size_query_param = 'page_size'  # page=4&page_size=5 表示查询第4页,每页显示5条max_page_size = 5  # 每页最大显示多少条


2.偏移分页

view:

 # 偏移分页# http://127.0.0.1:8000/api/v1/books/?limit=2&offset=5pagination_class = MYLimitOffsetPagination

page:

# 偏移分页
class MYLimitOffsetPagination(LimitOffsetPagination):# 重写几个类属性:4个default_limit = 2  # 每页显示多少条limit_query_param = 'limit'  # limit=3 这一页取三条offset_query_param = 'offset'  # 偏移量是多少 offset=3max_limit = 5  # 最多取5条


3.游标分页

views:

    # 游标分页# http://127.0.0.1:8000/api/v1/books/?ordering=idpagination_class = MyCursorPagination


page:

# 游标分页
class MyCursorPagination(CursorPagination):# 重写三个类属性cursor_query_param = 'cursor'  # 查询参数其实用不到page_size = 2  # 每页显示多少条ordering = 'id'  # 必须是要分页的数据表中的字段,一般按id来分

相关文章:

DRF之过滤,排序,分页

一、权限组件源码解读 1.继承了APIView 才有的---》执行流程---》dispatch中----》三大认证 APIView的dispatch def initial(self, request, *args, **kwargs):self.perform_authentication(request)self.check_permissions(request)self.check_throttles(request) 2 读…...

我的Redis学习,共写了14篇博客文章

早在19和20年全面学习SpringBoot相关技术知识时也曾经有学习到Redis,主要是看了几家的视频教程,但是未曾有具体的实践,后来再学习到Docker和Spring Session框架的Redis存储时,又稍微的实践了一丢丢,所有的实践也就仅此…...

mPython软件使用指南

①软件界面 一、软件界面的介绍 1.模式切换 硬件编程 Python3.6 Jupyter python3.6模式细节补充(一般不使用该模式,此处可跳过) Python3.6模式的界面 左侧指令分类栏 Python3.6模式的图形化指令分类分为: Python语法基础相关指令&…...

龙芯2K1000实战开发-系统配置详解

目录 概要 整体架构流程 技术名词解释 技术细节 ​编辑 总结...

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页:清风莫追欢迎关注本专栏:《一起撸个DL框架》GitHub获取源码:https://github.com/flying-forever/OurDLblibli视频合集:https://space.bilibili.com/3493285974772098/channel/series 文章目录 5 实现:自适…...

开箱即用的工具函数库xijs更新指南(v1.2.6)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用函数逻辑问题, 帮助开发者更高效的开展业务开发. 接下来就和大家一起分享一下 v1.2.6 版本的更新内容以及后续的更新方向. 贡献者列表: 1. 计算变量内存calculateMemory 该模块主要由 zhengsixsix 贡献, 我们可…...

【Netty】ChannelPipeline源码分析(五)

文章目录 前言一、ChannelPipeline 接口1.1 创建 ChannelPipeline1.2 ChannelPipeline 事件传输机制1.2.1 处理出站事件1.2.2 处理入站事件 二、ChannelPipeline 中的 ChannelHandler三、ChannelHandlerContext 接口3.1 ChannelHandlerContext 与其他组件的关系3.2 跳过某些 Ch…...

并行计算技术解密:MPI和OpenMP的学习和应用指南

欢迎来到并行计算技术的奇妙世界!本指南将带您深入了解MPI(Message Passing Interface)和OpenMP(Open Multi-Processing)两种重要的并行计算技术,并为您提供学习和应用的指南。无论您是一个科研工作者、开发…...

什么是自动化测试框架?我们该如何搭建自动化测试框架?

无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”…...

Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics

Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that the same history topic isn‘t sha…...

javaWebssh中小学课件资源系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh中小学课件资源系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT…...

MySQL高级查询操作

文章目录 前言聚集函数分组查询:GROUP BY过滤:HAVING嵌套子查询比较运算中使用子查询带有IN的子查询SOME(子查询)ALL(子查询)EXISTS子查询 前言 查询语句书写顺序: 1、select 2、from 3、where 4、group by 5、having 6、order by 7、limit …...

Day53【动态规划】1143.最长公共子序列、1035.不相交的线、53.最大子序和

1143.最长公共子序列 力扣题目链接/文章讲解 视频讲解 本题最大的难点还是定义 dp 数组 本题和718.最长重复子数组区别在于这里不要求是连续的了,但要有相对顺序 直接动态规划五部曲! 1、确定 dp 数组下标及值含义 dp[i][j]:取 text1…...

Three.js--》实现3d地球模型展示

目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多…...

<SQL>《SQL命令(含例句)精心整理版(6)》

《SQL命令(含例句)精心整理版(6)》 18 DB2查询语句18.1 查询数据库大小18.2 查看表占表空间大小18.3 查看正在执行的语句18.4 db2expln 查看执行计划18.5 db2advis 查看优化建议 19 空值19.1 NULL19.2 TRIM 18 DB2查询语句 18.1 …...

信息系统建设和服务能力评估证书CS

信息系统建设和服务能力评估体系CS简介 简介:本标准(团标T/CITIF 001-2019)是信息系统建设和服务能力评估体系系列标准的第一个,提出了对信息系统建设和服务提供者的综合能力要求。 发证单位:中国电子信息行业联合会。…...

vue3引入路由

1.首先在项目中安装路由 npm install vue-router -S 2.src文件夹下新建》views文件夹》新建home文件夹》新建Home.vue文件 在src文件夹下》新建router文件夹》新建index.js import { createRouter,createWebHashHistory } from vue-router const route s[ { path:/, compo…...

前后端联调跨域问题

文章目录 什么是同源策略如何判断是否同源?跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源? 如果…...

day11 - 手写数字笔迹细化

手写数字笔迹细化 对于手写数字识别实验中,经常会遇到因为笔迹较粗导致误识别的情况,所以我们通常会先将笔迹进行细化,笔迹变细以后,数字的特征会更明显,后续进行识别的准确率就会更高。 例如数字7 和 1 &#xff0c…...

C++ QT QDBus基操

以下是使用QDBus进行跨进程通信的具体用法&#xff1a; 1. 创建DBus服务 在服务端进程中&#xff0c;需要创建一个DBus服务&#xff0c;并注册DBus对象。示例代码如下&#xff1a; #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...