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视图类的更多相关文章

  1. drf04 drf视图类

    REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...

  2. 067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

  3. drf视图类总结

    ![image](https://img2022.cnblogs.com/blog/2608149/202204/2608149-20220401194236430-447848842.png)

  4. DRF之视图类(mixin)源码解析

     同样的增删改查操作,如果我们还像之前序列化组件那样做,代码重复率过多,所以我们用视图表示: 具体源码实现:首先定义一个视图类,然后根据mixin点进去有五个封装好的方法,这五个方法共有的属性就是都需 ...

  5. drf03 drf视图中提供的请求类和响应类

    drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...

  6. DRF介绍,DRF项目开发,DRF项目的视图类的dispatch源码解析

    目录 一.DRF介绍 1. 什么是DRF 2. 为什么要用DRF (1)使用DRF的原因 (2)站在开发者的角度来说用DRF的好处(暂时列举这么多) 二.用DRF开发后端项目 三.APIView请求生 ...

  7. DRF框架之视图类

    前后端分离的项目 >: pip3 install djangorestframework   一.视图类传递参数给序列化类 视图层:views.py 需求: (1)在视图类中实列化对象是,可以设 ...

  8. day73:drf:drf视图相关类&路由Routers&创建虚拟环境

    目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...

  9. 【Django drf】视图类APIView之五层封装 ApiView的类属性 drf配置文件

    目录 ApiView的类属性 drf 配置文件之查找顺序 drf之请求 APIView之请求相关配置 drf之响应 APIView之响应相关配置 Response对象属性 视图类 序列化类 路由 基于 ...

  10. drf之视图类与路由

    视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 2个视图基类 APIView rest_framework.v ...

随机推荐

  1. CSS中的选择( ::selection和user-select)

      CSS中的选择( ::selection和user-select) 在网络上,我们出于不同原因选择内容,也许我们想复制文本并在某处引用它.对于移动端来说,选择内容比较难,我不喜欢在移动端选择内容. ...

  2. 查看Windows操作系统编码方式

    chcp 编码表: 代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708)720 阿拉伯文(DOS)850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 ...

  3. 打包exe

    2.要打包的文件为多个py文件 这种情况一般你的代码较多,项目较大,可能你写了一个GUI界面py文件这个文件调用了其他文件的函数什么的,这个时候你需要生成spec文件来打包,这里假设你的要打包的主文件 ...

  4. Win10微软官方镜像iso文件下载

    1.转到下载页面2.按F12后点击小窗口左上角的手机图标3:刷新页面开始下载(win10.iso:链接)

  5. MySQL_demo_50道习题

    title: MySQL_demo_50道习题 author: 杨晓东 permalink: MySQL_demo date: 2021-10-02 11:27:04 categories: - 投篮 ...

  6. 38.Ribbon

    Ribbon默认是懒加载,所以初次请求时间最长,后续请求会变快,可以通过修改为饥饿加载 ribbon.eager-load.enabled=true ribbon.eager-load.clients ...

  7. window server 2012R2部署asp.net core项目应用程序池自动停止

    当在windows  server 2012R2上部署asp.net core项目时,需要安装the Hosting Bundle,但当我们安装完dotnet-hosting后,浏览站点应用程序池会自 ...

  8. pymongo解决查询的时区相差8小时

    背景 最近需要到mongoDB中查询数据,但是发现返回的日期总是和实际时间差8小时.到数据库查询了一下看到时间的确是准确的,只是查询出来的比实际的少了8小时. 通过网上查找资料了解到默认时区是UTC, ...

  9. Linux 看进程的线程数

    pstree -p 12345|wc -l 看进程的线程数 centos7默认并没有安装pstree,所以会有pstree:command not found 安装一下 yum install psm ...

  10. 接口自动化-pycharm下查看日志文件中文乱码

      如图: 方法:pycharm 进入setting,找到File Encodings将编码全部设置gbk 现在室这样的:    修改为: 再次看日志: