Django-drf视图层类的总结

25 篇文章 0 订阅
6 篇文章 0 订阅

APIView 和 GenericAPIView 两个视图基类

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView

GenericAPIView 封装了哪些东西?
### 重要属性### 
-queryset:放所有某个表查询出的数据
-serializer_class:要序列化的类
        
 ### 重要方法###
-get_queryset  :要序列化的所有数据,qs对象
-get_serializer :序列化类
-get_object  :修改,查询的单条

为什么要用APIView写接口?
可以将不同的 HTTP 请求方法(GET、POST、PUT、DELETE 等)分别实现在视图类的不同方法中,如 get()、post()、put()、delete() 等。这种结构使代码更有组织性和可读性。
同时,它还做了以下四件事
        -0 去除了csrf认证
        -1 包装了新的request
            -2 执行了认证,频率,权限 这三大认证
            -3 全局异常处理:在视图类的方法中执行报错,会被异常捕获,做统一处理


为什么要用GenericAPIView 写接口?
通常和数据库打交道的情况下,使用GenericAPIView写接口。
DRF 的 GenericAPIView 已经处理了大部分常见操作的逻辑,包括数据验证、序列化、响应生成等。
它已经实现了常见的 CRUD 操作(创建、读取、更新、删除),这意味着你可以在很少的代码中实现这些操作,减少了重复编写相似代码的工作。


APIView和GenericAPIView有什么不同?
APIView 它需要手动实现每个 HTTP 请求方法(GET、POST、PUT、DELETE 等)的逻辑,包括数据验证、序列化、响应生成等
GenericAPIView 它建立在 APIView 的基础上,已经实现了通用的 CRUD 操作(创建、读取、更新、删除)的逻辑
GenericAPIView 可以减少开发工作量,提高代码的可读性和可维护性。但如果你需要高度自定义的操作,可能需要使用 APIView 来实现特定的逻辑。

写序列化类时继承serializer和ModelSerializer的区别?
serializers.Serializer 是一个通用的序列化类,用于处理各种非模型数据,例如字典、嵌套结构、外部 API 数据等。需要手动定义字段,并编写序列化和反序列化的逻辑。
serializers.ModelSerializer 是用于模型数据(Django 模型)的序列化类,它自动根据模型字段生成序列化器字段,并提供了默认的序列化和反序列化逻辑。
serializers.ModelSerializer 主要取决于你的数据源。如果你处理的是数据库模型数据,通常会选择 ModelSerializer 以简化开发。如果你需要处理非模型数据,或者需要更多的自定义逻辑,那么可以使用通用的 Serializer 类。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 五个视图扩展类

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin,CreateModelMixin,DestroyModelMixin,ListModelMixin,UpdateModelMixin


五个视图扩展类是单独封装了creat updata delete等的五个方法,必须配合GenericAPIView使用,同时在只继承GenericAPIView的情况下,要在视图类中返回对应的方法,比如get方法,return出list,put方法,return出updata

  def get(self, request):  # 获取所有
        return self.list(request)

   def put(self, request, pk):  # 修改一个
        return self.update(request, pk)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# 9个视图子类

ListAPIView, 
CreateAPIView
ListCreateAPIView
RetrieveAPIView,
DestroyAPIView,
UpdateAPIView
RetrieveUpdateDestroyAPIView, 
RetrieveDestroyAPIView,
RetrieveUpdateAPIView

from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, UpdateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView,ListCreateAPIView


9个视图子类,分别继承了他们对应的五个视图扩展类和GenericAPIView
封装程度很高,原本五个视图扩展类需要return出请求方式和对应方法的关系,9个视图子类,已经分别把他们封装了
请求方式和方法名,是在九个视图子类中封装的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 视图集
-ModelViewSet:重写方法实现你想要的功能
-ReadOnlyModelViewSet
-ViewSetMixin:路由写法变了

-ViewSet:ViewSetMixin+APIView        # 这俩是分别继承了 两个基类中的一个和ViewSetMixin
-GenericViewSet:ViewSetMixin+GenericAPIView

ModelViewSet --
    # 它继承了五个视图扩展类和GenericViewSet,GenericViewSet又继承了ViewSetMixin和GenericAPIView
所以在用它的时候,有几个需要注意的地方
    1 一是路由写法变了,由ViewSetMixin提供的功能,
        路由写法变了,是因为GenericViewSet内部重写了as_view()方法,通过反射得到方法名,再通过反射,设置请求方式,对应的方法名,从而执行设置好的方法。
    2 五个接口实现了,由五个视图扩展类提供功能
    3 所以视图类中,方法名可以随意命名,只要做好路由映射就行。


ReadOnlyModelViewSet -- 
    # 以后写的接口,只想有 获取单条和获取所有,继承它

-ViewSetMixin--
    # 路由中做好映射的配置,-ViewSetMixin 重写了as_view(),请求来了之后,执行ViewSetMixin中的as_view()中的view方法。
# path('abc/', PublishView.as_view({'get': 'list', 'post': 'create'})),  # 路由的变化
# path('abc/<int:pk>', PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

ViewSet --
    # 继承了 ViewSetMixin+APIView ,路由写法变了,不需要序列化时,可以用这个,因为它封装程度不高,大部分都要自己写。封装程度高的,是里面已经封装了数据的操作和序列化的操作,所以不需要序列化的时候可以用ViewSet


GenericViewSet -- 
    # 继承了ViewSetMixin+GenericAPIView ,路由写法变了,里面封装了数据库操作和序列化操作,所以需要序列化,并且和数据库有关的,但是封装程度又不想太高的情况下,可以用它--GenericViewSet
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值