from rest_framework import views, generics, mixins, viewsets views:视图类 mixins:视图工具类 generics:工具视图类 viewsets:视图集
#俩大视图类: from rest_framework.views import APIView from rest_framework.generics import GenericAPIView # APIView,GenericAPIView # GenericAPIView:是全部工具视图的父类
# 六大视图工具类: from rest_framework.mixins import RetrieveModelMixin,ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin # RetrieveModelMixin,单查询 # ListModelMixin,群查询 # CreateModelMixin,增长 # UpdateModelMixin,更新,在这里面有两种方法,所以是六大视图工具类 # DestroyModelMixin,删除
# 九大工具视图类 from rest_framework.generics import CreateAPIView,DestroyAPIView,GenericAPIView,ListAPIView,ListCreateAPIView,RetrieveAPIView,RetrieveDestroyAPIView,RetrieveUpdateAPIView,RetrieveUpdateDestroyAPIView,UpdateAPIView # CreateAPIView,单增长 # DestroyAPIView,删除 # GenericAPIView,基类 # ListAPIView,群查 # ListCreateAPIView,群查,单增长 # RetrieveAPIView,单查 # RetrieveDestroyAPIView, # RetrieveUpdateAPIView, # RetrieveUpdateDestroyAPIView, # UpdateAPIView
#两大视图集基类 from rest_framework.viewsets import ViewSet,GenericViewSet # ViewSet, # GenericViewSet
from django.db import models # Create your models here. class Student(models.Model): name = models.CharField(max_length=64)
from rest_framework.views import APIView
APIView继承Django的View
1) View:将请求方式与视图类的同名方法创建映射,完成请求响应
2) APView:
主要继承了View的功能;
重写as_view禁用csrf认证;
重写dispatch:请求、响应、渲染、异常、解析、三大认证
多了一堆类属性,能够完成视图类的局部配置django
from . import models, serializers from rest_framework.response import Response class StudentAPIView(APIView): def get(self, request, *args, **kwargs): stu_query = models.Student.objects.all() stu_ser = serializers.StudentModelSerializer(stu_query, many=True) return Response(stu_ser.data)
url(r'^v1/students/$', views.StudentAPIView.as_view()), url(r'^v1/students/(?P<pk>\d+)/$', views.StudentAPIView.as_view()),
from rest_framework.generics import GenericAPIView class GenericAPIView(views.APIView):#继承了views.APIView的全部功能
# GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer() class StudentGenericAPIView(GenericAPIView): queryset = models.Student.objects.all() serializer_class = serializers.StudentModelSerializer def get(self, request, *args, **kwargs): # stu_query = models.Student.objects.all() stu_query = self.get_queryset() # stu_ser = serializers.StudentModelSerializer(stu_query, many=True) stu_ser = self.get_serializer(stu_query, many=True) return Response(stu_ser.data)
url(r'^v2/students/$', views.StudentGenericAPIView.as_view()), url(r'^v2/students/(?P<pk>\d+)/$', views.StudentGenericAPIView.as_view()),
from rest_framework import mixins class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView): queryset = models.Student.objects.all() serializer_class = serializers.StudentModelSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)
url(r'^v3/students/$', views.StudentMixinGenericAPIView.as_view()), url(r'^v3/students/(?P<pk>\d+)/$', views.StudentMixinGenericAPIView.as_view()),
主要是查询是最重要的api
单查询和群查询不能同时使用iview
# 工具视图类 from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView class StudentMixinAPIView(CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView): queryset = models.Student.objects.all() serializer_class = serializers.StudentModelSerializer # url中单查,不必定必须提供主键,提供一切惟一键的字段名都可 lookup_url_kwarg = 'id' # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除 def destroy(self, request, *args, **kwargs): pass
url(r'^v4/students/$', views.StudentMixinAPIView.as_view()), url(r'^v4/students/(?P<id>\d+)/$', views.StudentMixinAPIView.as_view()), # 将全部 请求方式 与 响应方法名 的映射关系交给用户本身配置
能够解决单查和群查询工具
from rest_framework.viewsets import ModelViewSet class StudentModelViewSet(ModelViewSet): queryset = models.Student.objects.all() serializer_class = serializers.StudentModelSerializer def my_post(self, request, *args, **kwargs): return Response('my post ok')
url(r'^v5/students/$', views.StudentModelViewSet.as_view({ 'get': 'list', 'post': 'my_post' })), url(r'^v5/students/(?P<pk>\d+)/$', views.StudentModelViewSet.as_view({ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' })),