首页 > 其他分享 >视图集

视图集

时间:2022-10-03 11:00:35浏览次数:56  
标签:get self request 视图 class 图集 view

两个视图基类

1.drf提供了一个顶层的视图APIView,可以通过继承APIView写视图,之后我们写的代码可能重复代码比较多,就可以使用面向对象的继承、封装,GenericAPIView继承了APIView,我们用GenericAPIView时就不需要继承APIView

2.GenericAPIView的属性和方法
2.1属性
-queryset
要序列化的数据
-serializer_class
序列化类
-lookup_field
通过get_object获取单个对象的查询key值,value值是由路由中传进来的
-filter_backends
过滤器
-pagination_class
分页器

2.2方法
-get_queryset
获取要序列化的数据
-get_object
根据lookup_field配置的参数获取一条数据
-get_serializer
获取序列化类,我们直接使用
-get_serializer_class
获取序列化类,不是我们直接使用的,它在get_serializer里调用了它
-filter_queryset
跟过滤有关系
-paginate_xxx
跟分页有关系

5个视图扩展类写接口

'必须配合GenericAPIView使用'
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
'''
ListModelMixin:写了list方法,就是我们原来的获取所有数据的get中的代码
CreateModelMixin:写了create方法,就是我们原来的post中的代码
RetrieveModelMixin:写了retrieve方法,就是我们原来的获取单条数据的get中的代码
UpdateModelMixin:写了update方法,就是我们原来的put中的代码
DestroyModelMixin:写了destroy方法,就是我们原来的delete中的代码
'''

class BookView(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class BookDataView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

9个视图子类写接口

'视图类继承GenericAPIView+某个某几个视图扩展类'
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView, RetrieveUpdateAPIView, RetrieveDestroyAPIView
'没有Update+Destroy'

class BookView(ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer


class BookDataView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

视图集

继承ModelViewSet编写5个接口

1.视图类
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
'ReadOnlyModelViewSet只能查询一个或查询所有'

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

2.路由
urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', BookView.as_view({'get': 'list', 'post': 'create'})),
    path('book/<str:pk>/', BookView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

ViewSetMixin源码

# ViewSetMixin:它控制了路由的写法变了
# ViewSet:APIView+ViewSetMixin的组合
# GenericViewSet:GenericAPIView+ViewSetMixin的组合
'''
ModelViewSet---继承了下面一堆,在路由中配置as_view,执行的就是ViewSetMixin的as_viewViewSetMixin的as_view
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
'''

-在ViewSetMixin里的as_view中
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
    # 路由中as_view中必须传参数,必须传字典:{'get': 'list', 'post': 'create'}
    if not actions:
        raise TypeError("The `actions` argument must be provided when "
                        "calling `.as_view()` on a ViewSet. For example "
                        "`.as_view({'get': 'list'})`")
-路由匹配成功,执行view(request),request是老的request
        def view(request, *args, **kwargs):
        	    # actions是字典:{'get': 'list', 'post': 'create'}
                for method, action in actions.items():
                    # method:get	action:list
                    # self是视图类的对象中通过反射,查找list
                    # handler是视图类中的list方法
                    handler = getattr(self, action)
                    # 向视图类的对象中反射method(get),handler:(list)方法
                    # self.get=list
                    setattr(self, method, handler)
                return self.dispatch(request, *args, **kwargs)
        return csrf_exempt(view)
'''
只要继承了ViewSetMixin,以后路由写法变量,都要写成:
BookView.as_view({'get': 'list', 'post': 'create'})
这样写好后,对应请求方式来了,就会执行配置的方法
'''
# 视图类中继承了ViewSetMixin,就可以写任意名字的方法,不用非得写get...

1.APIView:它有as_view,dispatch

2.GenericAPIView:继承了APIView,他有类属性和方法

3.5个视图扩展类:ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
-每个类里有一个方法

4.9个视图扩展类

ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView, RetrieveUpdateAPIView, RetrieveDestroyAPIView

标签:get,self,request,视图,class,图集,view
From: https://www.cnblogs.com/riuqi/p/16750156.html

相关文章

  • drf之视图集
    一、试图基类#我们之前学习的drf在编写视图类的时候是继承了APIView和GenericAPIView#GenericAPIView的属性和方法回顾:-属性-queryset#要......
  • 【Django-rest-framework框架】第04回 视图集
    目录1.两个视图基类1.1GenericAPIview属性和方法1.2基于APIView写5个接口1.3基于GenericAPIview写5个接口2.5个视图扩展类3.9个视图子类4.视图集5.源码分析ViewSet......
  • 肖sir__java__图集
    (1)修饰符Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:访问控制修饰符:default,public,protected,private非访问控制修饰符:final,abstract,sta......
  • WordPress美女图集COS写真整站自适应网站源码带完整数据
    这是自己做的网站,因为自己要做别的业务,没有时间打理,而且放着也是放着,不如拿来分享给大家,这个资源非常火爆,用来引流还是很轻松的。 网站从服务器备份了下来,所以有完整......
  • Drf视图集合
    1.背景:    技术储备,drf适合前后端分离项目,比较适合单表操作的业务,另外丰富的视图集合配合路由自动生成,开发速度能得到极大的提升。 2、视图分类:   ......