rest-framework 视图类源码分析
从miminx 类开始,依次有子类RetrieveModelMixin(单个get 请求))
,ListModelMixin(LIST请求),CreateModelMixin(POST请求),UpdateModelMixin(update更新请求),DestroyModelMixin(delete)删除请求
从url角度总结:
url(r'^(?P<version>[v1|v2]+)/test1/$', views.TestView1.as_view({'get':'list','post':'create'})),
url(r'^(?P<version>[v1|v2]+)/test1/(?P<pk>\+d)$', views.TestView1.as_view({'put':'update','patch':'partial_update',
'delete':'destroy','get':'retrieve'}))
源码分析:以ListAPIView分析
from rest_framework import response
from rest_framework.generics import ListAPIView,RetrieveAPIView
from rest_framework.response import Response
from auction.utils.PageFilter.filters import PullDownRefreshFilter,ReachBottomFilter
from auction.utils.PageFilter.paginations import AuctionLimitPagination
from api import models
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import RetrieveModelMixin,ListModelMixin
class auctionView(ListAPIView):
# 如果是列表必须两个数据,一个是查询数据,一个是序列化
queryset = models.Auction.objects.filter(status__gt=0).order_by('id')
serializer_class = auctionSerializers
filter_backends = [ReachBottomFilter,PullDownRefreshFilter]
pagination_class = AuctionLimitPagination
源码解析:
# 第一步:LISTAPIView 继承mixins.ListModelMixin,GenericAPIView;ListModelMixin类中def get()方法,可以替视图接受GET请求
class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
# 第二步 执行类ListModelMixin的self.list()方法 def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
#第三步执行self.get_querset()获取queryset ,是类GenericAPIView的方法
def get_queryset(self):
assert self.queryset is not None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__
) queryset = self.queryset# 获取 ListAPIView的queryset
# 是否是对象,类,或元组,
if isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset = queryset.all()
return queryset
# 第四步 执行self.filter_queryset(queryset)是类GenericAPIView的方法
# 过滤queryset
def filter_queryset(self, queryset):
""
"""
for backend in list(self.filter_backends):#self.filter_backends过滤条件
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
# 第五步 执行self.paginate_querys(),是类GenericAPIView的方法
# 对queryset进行分页处理
def paginate_queryset(self, queryset):
"""
Return a single page of results, or `None` if pagination is disabled.
"""
if self.paginator is None:
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
# 第六步 执行self.get_serializer方法(),返回self.serializer_class,并实例序列化
def get_serializer_class(self):
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
) return self.serializer_class
# 第七步 get_paginated_response(serializer.data) ,返回序列化结果
其他几个类
RetrieveModelMixin(单个get 请求)),CreateModelMixin(POST请求),UpdateModelMixin(update更新请求),DestroyModelMixin(delete)删除请求源码分析同理。
rest-framework 视图类源码分析的更多相关文章
- List 接口以及实现类和相关类源码分析
List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除( ...
- Django_Restframwork_APIVIEW视图_源码分析
Django _VIEW视图_源码分析
- Django REST framework —— 认证组件源码分析
我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...
- ApiView/Request类源码分析/序列化器
内容概要 ApiView+JsonResponse编写接口 ApiView+Response编写接口 ApiView源码解析 Request对象源码分析 序列化器介绍和快速使用/反序列化 反序列化的校 ...
- Cocos2d-X3.0 刨根问底(六)----- 调度器Scheduler类源码分析
上一章,我们分析Node类的源码,在Node类里面耦合了一个 Scheduler 类的对象,这章我们就来剖析Cocos2d-x的调度器 Scheduler 类的源码,从源码中去了解它的实现与应用方法. ...
- Java Properties类源码分析
一.Properties类介绍 java.util.Properties继承自java.util.Hashtable,从jdk1.1版本开始,Properties的实现基本上就没有什么大的变动.从ht ...
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...
- Java并发编程笔记之Unsafe类和LockSupport类源码分析
一.Unsafe类的源码分析 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通过使用JNI的方式来访问本地C++实现库. rt.jar ...
- Django rest framework框架——APIview源码分析
一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...
- String 类源码分析
String 源码分析 String 类代表字符序列,Java 中所有的字符串字面量都作为此类的实例. String 对象是不可变的,它们的值在创建之后就不能改变,因此 String 是线程安全的. ...
随机推荐
- [C++/Java/Py/C#/Ruby/Swift/Go/Scala/Kotlin/Rust/PHP/TS/Elixir/Dart/Racket/Erlang] LeetCode2185. 统计包含给定前缀的字符串
目录 题解地址 代码 cpp java python3 C# ruby swift golang scala kotlin rust php typescript elixir dart racket ...
- Vditor在原生JS中如何结合后端使用
目录 1.Vditor介绍 2.如何在原生JS中结合后端使用 2.1 背景 2.2 正确使用方式 2.2.1 编辑页面 2.2.2 回显页面(修改页面) 2.2.3 预览页面 3.小结一下 1.Vdi ...
- VUE中的next({ ...to, replace: true })
beforeEach((to, from, next) => { next('/logon') } 上面这串代码我们可以看成为 beforeEach((to, from, next) => ...
- 二进制安装Kubernetes(k8s)IPv4/IPv6双栈 v1.24.0
二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 介绍 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 和 1.24 ...
- python入门教程之十三错误和异常
作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和异常. Python as ...
- [Windows/CMD]不重启设置/刷新环境变量
1 文由 当我已经通过如下路径设置了Maven的环境(maven-3.5.4). "我的电脑"->"属性"->"高级"-> ...
- Kubernetes学习之旅
# Kubernetes学习之旅 ## 引言 - 为什么选择Kubernetes- Kubernetes简介- Kubernetes的发展历程 ## Kubernetes基本概念 - 节点(Node) ...
- SQL Case条件判断语句
问题描述:在表中取到一些值做出判断,配合监控监测一些表中的数据.使用select case when if 来做条件查询判断 CASE 表达式遍历条件并在满足第一个条件时返回一个值(类似于 if-th ...
- PHP的WAMP的安装
WAMP独立安装 软件官网下载: Apache:http://httpd.apache.org/download.cgi MySQL:http://dev.mysql.com/downloads/ P ...
- Arrays.asList() 示例
1 package Test.others; 2 3 import java.util.Arrays; 4 import java.util.Collections; 5 import java.ut ...