欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

drf框架学习一:视图类

程序员文章站 2022-07-12 11:20:18
...

drf框架的视图类梳理

drf框架官方文档:
https://www.django-rest-framework.org/

drf框架对django中的视图类进行了多层的封装,可以很方便的写视图层逻辑来满足我们的需求
主要模块有:

  • views模块
  • generic模块
  • mixins模块
  • viewsets模块

1.views模块

views模块主要是对django中的View类进行了封装–变成APIView类;在编写视图函数的时候,通过继承该类,可以很快速的对模型数据进行序列化输出.
代码如下:

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import UsersSerializer

 #序列化模型,返回的drf框架自带的web页面
    class UsersSerializerView(APIView):
     '''
     users information.
     '''
     def get(self, request):
         users = Users.objects.all()[:3]
         users_serializer = UsersSerializer(users, many=True)
         return Response(users_serializer.data)

2.mixins模块

mixins模块主要提共了一些自定义的类,这些类中对应了特定的方法,如:list,create,update等,通过这些方法我们可以获取我们想要的序列化列表,或某一条序列化信息等;
主要包含五大类:

  • CreateModelMixin类–定义了create方法,可以创建一个模型类实例数据
  • ListModelMixin类–定义了list方法,获取所有模型实例的数据
  • RetrieveModelMixin类–定义了retrieve方法,获取当个模型实例的数据
  • UpdateModelMixin类–定义了update方法,更新模型实例的数据
  • DestroyModelMixin–定义了delete方法,删除一个实例的数据

3.generic模块

generic模块主要是对views模块中的APIview视图类进行了再次封装–形成了GenericAPIView类,封装了相关属性如:query_set,serializer_class等,新增了数据分页功能,再进一步的简化了视图类的代码;

from rest_framework import mixins
from rest_framework import generics

	class UsersSerializerView(mixins.ListModelMixin, generics.GenericAPIView):
     '''
     users all information.
     '''
     queryset = Users.objects.all().order_by('id')
     # 指定数据序列化类
     serializer_class = UsersSerializer
     #pagination_class = UsersPaginatorView
 
    def get(self, request, *args, **kwargs):
    	# 直接返回mixins中的list方法即可返回,指定模型的所有数据
        return self.list(request, *args, **kwargs)

另外,generic模块还将mixins模块中的类和GenericAPIView类结合在一起,封装了更高层的几个类,这样就可以将http方法和mixins中的特定的方法绑定,更加简化视图类
主要的类有:

  • CreateAPIView–继承了mixins.CreateModelMixin,GenericAPIView同时将post方法和create绑定
  • ListAPIView–继承了mixins.ListModelMixin,GenericAPIView同时将get方法和list绑定

这样在编写上面的类视图代码中就可以直接省去了get方法:

	class UsersSerializerView(ListAPIView):
     '''
     users all information.
     '''
     queryset = Users.objects.all().order_by('id')
     # 指定数据序列化类
     serializer_class = UsersSerializer

4.viewsets模块

viewsets模块中主要包含了自定义了ViewSetMixin类,GenericViewSet类,ModelViewSet类:

  • ViewSetMixin类重写了as_view方法,这样在写路由的时候就可以将http方法和特定了方法绑定(如{get:list, post:create})
  • GenericViewSet类继承了ViewSetMixin类和GenericAPIView类
  • ModelViewSet类继承了mixins模块中的各个类和GenericViewSet类

优化了路由配置,更简化了视图类的编写:

from rest_framework import viewsets

	class UsersSerializerView():
     '''
     users all information.
     '''
     queryset = Users.objects.all().order_by('id')
     # 指定数据序列化类
     serializer_class = UsersSerializer

利用router模块简化路由配置:

from rest_framework.routers import DefaultRouter
from users.views import UsersSerializeView
# 实例化一个router类
router = DefaultRouter()
# 将路由地址注册到router实例
router.register(r'users', UsersSerializerViewSet, basename='users')

urlpatterns = [
	path('', include(router.urls)),
]

总结:
views模块和mixins模块是drf框架中出来视图的两个基本的类,其他的generic模块和viewsets模块都是针对views模块中的类和mixins模块中的类的更高层次的封装,是为了更进一步的简化视图类的编写,从而实现返回所需的特定的序列化数据.