drf视图类
1 2个视图基类
# django 内置的View
# drf 的APIView ,继承自View
# GenericAPIView
-两个重要的类属性:
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
-几个重要的方法:
self.get_object()
self.get_queryset()
self.get_serializer(instance=book_list, many=True)
1.1 使用APIView写5个接口
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
# 如果写了many=True,ser是哪个类的对象?
ser=BookSerializer(instance=book_list,many=True)
print(type(ser)) # ListSerializer的对象---》[BookSerializer,BookSerializer,BookSerializer]
return Response(ser.data)
def post(self,request):
ser=BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':'100','msg':'创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败','err':ser.errors})
class BookDetailView(APIView):
def get(self,request,*args,**kwargs): # pk 从kwargs中去
book=Book.objects.filter(pk=kwargs['pk']).first()
# 如果写了many=True,ser是哪个类的对象?
ser=BookSerializer(instance=book)
print(type(ser)) # BookSerializer的对象
return Response(ser.data)
#put:全局修改 patch:局部修改
def put(self,request,*args,**kwargs): # pk 从kwargs中去
book=Book.objects.filter(pk=kwargs['pk']).first()
ser=BookSerializer(instance=book,data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
1.2 继承GenericAPIView写5个接口
class BookView(GenericAPIView):
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
def get(self, request):
print('dsafdasdfasd')
book_list = self.get_queryset() # 获取要序列化的数据,不要直接使用self.queryset,而要用self.get_queryset()
# 获取序列化类,要使用self.get_serializer
ser = self.get_serializer(instance=book_list, many=True)
print(type(ser)) # ListSerializer的对象---》[BookSerializer,BookSerializer,BookSerializer]
return Response(ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
class BookDetailView(GenericAPIView):
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
#传入的必须叫pk,否则,get_object就拿不到对象
def get(self, request, *args, **kwargs):
# 获取单个对象,
book = self.get_object()
# 如果写了many=True,ser是哪个类的对象?
ser = self.get_serializer(instance=book)
print(type(ser)) # BookSerializer的对象
return Response(ser.data)
# put:全局修改 patch:局部修改
def put(self, request, *args, **kwargs): # pk 从kwargs中去
book = self.get_object()
ser = self.get_serializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': '100', 'msg': '创建成功'})
else:
return Response({'code': '101', 'msg': '创建失败', 'err': ser.errors})
2 5 个视图扩展类
# 视图扩展类---》不是视图类---》没有继承视图类(View,APIView...子类)
ListModelMixin, #获取所有
CreateModelMixin,#创建一个
RetrieveModelMixin,#查询一个
UpdateModelMixin,#更新一个
DestroyModelMixin#删除一个
# class ListModeMixin():
# def list(self, request):
# print('dsafdasdfasd')
# book_list = self.get_queryset() # 获取要序列化的数据,不要直接使用self.queryset,而要用self.get_queryset()
#
# # 获取序列化类,要使用self.get_serializer
# ser = self.get_serializer(instance=book_list, many=True)
# print(type(ser)) # ListSerializer的对象---》[BookSerializer,BookSerializer,BookSerializer]
# return Response(ser.data)
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
class BookView(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
def get(self,request):
print('获取所有')
return super().list(request)
def post(self, request):
return super().create(request)
class BookDetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
#传入的必须叫pk,否则,get_object就拿不到对象
def get(self, request, *args, **kwargs):
print('获取一')
return super().retrieve(request, *args, **kwargs)
# put:全局修改 patch:局部修改
def put(self, request, *args, **kwargs): # pk 从kwargs中去
return super().update(request, *args, **kwargs)
def delete(self,request, *args, **kwargs):
return super().destroy(request, *args, **kwargs)
3 9个视图子类
# 获取所有,新增一个,获取所有和新建一个
ListAPIView,CreateAPIView,ListCreateAPIView
# 获取单个,更新一个,删除一个
RetrieveAPIView,UpdateAPIView,DestroyAPIView
#
RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
# 继承9个视图子类后,只需要在视图类中写两个类属性即可
class BookView(ListCreateAPIView): # 获取所有和新增一个
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
class BookDetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all() # 要序列化的数据
serializer_class = BookSerializer # 序列化类
4 视图集
ModelViewSet=
# 5个视图扩展类---》每个类里有一个方法 list,create,retrieve,destory,update
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
# ViewSetMixin:特点,只要继承它,路由写法变了,变成了:as_view({'get': 'list', 'post': 'create'}---》请求方式和方法的对应关系
# generics.GenericAPIView 2个视图基类中得一个
GenericViewSet
-ViewSetMixin+GenericAPIView
# ViewSetMixin 源码分析
class ViewSetMixin:
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
# actions={'get': 'list', 'post': 'create'}
def view(request, *args, **kwargs):
# method:get action:list
for method, action in actions.items():
# handler就是list
handler = getattr(self, action) #视图类反射有没有list
# 反射:把get变成了list
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
# 如果请求来了,会执行 view(request)
# 视图集中的类
-ModelViewSet
-ReadOnlyModelViewSet
-ViewSetMixin
-ViewSet :ViewSetMixin+APIView
-GenericViewSet:ViewSetMixin+GenericAPIView
# 以后你想继承APIView,但是路由想自动生成,继承ViewSet
# 以后想继承GenericViewSet,但是路由想自动生成,GenericViewSet
5 路由组件
# 1 继承了ViewSetMixin及其子类,路由写法变了
-写法一:path('publish', views.PublishView.as_view({'get': 'lqz','post':'login'})),
-写法二:自动生成
# 第一步:导入一个路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# 第二步:实例化得到对象
router=SimpleRouter()
# router = DefaultRouter() # 它会给每个注册的视图类都生成一个根路由
# 第三步:注册路由---》使用视图类注册---》能自动生成路由
router.register('books', views.BookView, 'books')
router.register('publish', views.BookView, 'publish')
# 第四步:在总路由中注册 方式二
path('', include(router.urls)),
# 第四步:在总路由中注册 方式一
# urlpatterns+=router.urls
# action装饰器的用法
-之前自动生成路由只能生成
{'get': 'list', 'post': 'create'},{'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
-使用action装饰器来做对应关系
'''
methods:请求方式
detail:
False:是不是带id的路由 http://127.0.0.1/publish/3 http://127.0.0.1/publish
True: 生成的路由publish/pk/lqz/
url_path:如果不写,就是函数名生成的路径是:http://127.0.0.1/publish/lqz
url_name:别名
'''
5.1 路由
path('publish', views.PublishView.as_view({'get': 'lqz','post':'login'})),
5.2 视图类
class PublishView(ViewSetMixin,APIView): # 路由写法变了,变成映射关系了,在视图类中可以写任意的方法名
def lqz(self,request):
return Response('lqz')
def login(self,request):
return Response('login')
补充
1 # 浏览器输入地址 www.taobao.com----》dns(本地,网络)(host文件)查找 ip地址--》向这个地址的80端口发送请求(没写端口就是80)
2 序列化的时候,如果传了many=True,生成的序列化类对的对象是ListSerializer的对象
3 assert 断言 本质就是if+抛异常
a = 11
# if a!=10:
# raise Exception('a必须是10,不然不能往后走')
assert a == 10, ('a必须是10,不然不能往后走')
print(a)
4 列表相加
drf视图类的更多相关文章
- drf04 drf视图类
REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- drf视图类总结

- DRF之视图类(mixin)源码解析
同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...
- drf03 drf视图中提供的请求类和响应类
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...
- DRF介绍,DRF项目开发,DRF项目的视图类的dispatch源码解析
目录 一.DRF介绍 1. 什么是DRF 2. 为什么要用DRF (1)使用DRF的原因 (2)站在开发者的角度来说用DRF的好处(暂时列举这么多) 二.用DRF开发后端项目 三.APIView请求生 ...
- DRF框架之视图类
前后端分离的项目 >: pip3 install djangorestframework 一.视图类传递参数给序列化类 视图层:views.py 需求: (1)在视图类中实列化对象是,可以设 ...
- day73:drf:drf视图相关类&路由Routers&创建虚拟环境
目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...
- 【Django drf】视图类APIView之五层封装 ApiView的类属性 drf配置文件
目录 ApiView的类属性 drf 配置文件之查找顺序 drf之请求 APIView之请求相关配置 drf之响应 APIView之响应相关配置 Response对象属性 视图类 序列化类 路由 基于 ...
- drf之视图类与路由
视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 2个视图基类 APIView rest_framework.v ...
随机推荐
- reids哨兵机制
宏观上的哨兵机制 监控:哨兵不断的检查master和slave是否正常的运行. 通知:当监控的某台Redis实例发生问题时,可以通过API通知系统管理员和其他的应用程序. 自动故障转移:如果一个mas ...
- 玩玩 Visual Studio Code 和 MSYS2
注意:为了便于理解本文内容,您可能需要一些前置知识,例如命令行操作,编译器操作,路径操作,环境变量操作,vscode操作-- 众所周知 Visual Studio Code 是一个优秀的编辑器. 众所 ...
- .net ef 链接 mysql
https://blog.csdn.net/weixin_30394975/article/details/114168133
- sql server 常用高级查询sql
数据源:表:coursename kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英语 90赵六 语文 88赵六 数 ...
- docker 启动 重启命令
启动 systemctl start docker 守护进程重启 sudo systemctl daemon-reload 重启docker服务 systemctl restar ...
- 5.docker安装redis
下载redis镜像 不讲那么细了,可以参考docker安装mysql的介绍 docker pull redis 不加冒号和版本表示下载最新版本的 镜像下载完后可以数据 docker images 命令 ...
- 尝试在Ubuntu中安装Emacs遇到的问题
出现具体问题 今日学习安装emacs在Ubuntu19.04当中 安装详见下方帖子: 链接: 如何在Ubuntu中安装Emacs. 安装遇到问题,即 sudo add-apt-repository p ...
- 12个有用的JavaScript数组技巧
数组是Javascript最常见的概念之一,它为我们提供了处理数据的许多可能性,熟悉数组的一些常用操作是很有必要的. 1.数组去重 1.from()叠加new Set()方法 字符串或数值型数组的去重 ...
- PAT-basic-1024 科学计数法 java
一.题目 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位,小数部分至少有 1 位,该 ...
- mycat分片的十四种算法
MyCat的分片规则配置在 conf目录下的 rule.xml文件中定义 ; 环境准备 : schema.xml中的内容做好备份 , 并配置 逻辑库; <schema name="PA ...