DRF視圖組件: django
CVB模式繼承----五層 from django.views import View # Django的View from rest_framework.views import APIView # drf的APIView繼承View from rest_framework.generics import GenericAPIView, CreateAPIView # drf的GenericAPIView繼承APIView # 如下CBV須要在路由的as_view()中添加對應參數---請求方式和函數的映射:無參數{'get':'list','post':'create'},帶參數{'get':'retrive'} from rest_framework.viewsets import GenericViewSet # drf的GenericViewSet繼承ViewSetMixin和GenericAPIView,路由改變:需指定請求方法--視圖函數映射 from rest_framework.viewsets import ModelViewSet # drf的ModelViewSet繼承查(多條)、增、查(單條)、刪、改和GenericViewSet,共有一個視圖便可,路由有改變:需指定請求方法--視圖函數(默認繼承類處理)映射 通常多用APIView,對於基本的增刪改查可直接使用ModelViewSet
models.py api
class UserGroup(models.Model): title = models.CharField(max_length=10)
urls.py
session
drf主路由配置urls.py: app
from django.conf.urls import url,include urlpatterns = [ url(r'^api/', include('api.urls')), ]
api主路由配置urls.py:ide
from django.conf.urls import url from api import views urlpatterns = [ # 繼承APIView的路由寫法 url(r'^(?P<version>v[\d+])/groups1/$', views.UserGroupView1.as_view(), ), url(r'^(?P<version>v[\d+])/group1/(?P<pk>\d+)/$', views.UserGroupView11.as_view(), ), #繼承GenericAPIView的路由寫法 url(r'^(?P<version>v[\d+])/groups2/$', views.UserGroupView2.as_view(), ), url(r'^(?P<version>v[\d+])/group2/(?P<pk>\d+)/$', views.UserGroupView22.as_view(), ), # 繼承GenericViewSet的路由 url(r'^(?P<version>v[\d+])/groups3/$', views.UserGroupView3.as_view({'get':'list','post':'create'}), ), url(r'^(?P<version>v[\d+])/group3/(?P<pk>\d+)/$', views.UserGroupView33.as_view({'get':'retrieve','put':'update','delete':'destroy'}), ),# 默認就是pk,或者自定義但須要指定但要在類中定義lookup_url_kwarg # 繼承ModelViewSet的路由(執行同一個視圖便可,有視圖繼承的不一樣類分別進行處理) url(r'^(?P<version>v[\d+])/groups4/$', views.UserGroupView4.as_view({'get': 'list', 'post': 'create'}), ), url(r'^(?P<version>v[\d+])/group4/(?P<pk>\d+)/$', views.UserGroupView4.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}), ), # 默認就是pk,或者自定義但須要指定但要在類中定義lookup_url_kwarg ]
views.py 函數
from django.shortcuts import render, HttpResponse from rest_framework import serializers from api import models from rest_framework.response import Response#DRF自帶,可自動進行序列化 #序列化器 class UserGroupSerializer1(serializers.ModelSerializer): class Meta: model = models.UserGroup fields = "__all__" #1.繼承APIView的CBV寫法 from rest_framework.views import APIView class UserGroupView1(APIView): def get(self, request, *args, **kwargs): groups = models.UserGroup.objects.all() ser_groups = UserGroupSerializer1(instance=groups, many=True) ret = ser_groups.data return Response(ret) def post(self, request, *args, **kwargs): ser_data = UserGroupSerializer1(data=request.data) if ser_data.is_valid(): # 序列化器校驗 ser_data.save() # 返回當前對象(序列化有instance就是更新) else: return Response(ser_data.errors) return self.get(request, *args, **kwargs) class UserGroupView11(APIView): def get(self, request, *args, **kwargs): pk = kwargs.get('pk') group = models.UserGroup.objects.get(pk=pk) ser_group = UserGroupSerializer1(instance=group) # many默認就是False ret = ser_group.data return Response(ret) def put(self, request, *args, **kwargs): pk = kwargs.get('pk') group = models.UserGroup.objects.get(pk=pk) ser_data = UserGroupSerializer1(instance=group, data=request.data) if ser_data.is_valid(): r = ser_data.save() print(r) else: return Response(ser_data.errors) return self.get(request, *args, **kwargs) def patch(self, request, *args, **kwargs): pass def delete(self, request, *args, **kwargs): pass #2.繼承GenericAPIView的CBV寫法(不實用--看源碼) from rest_framework.generics import GenericAPIView, CreateAPIView class UserGroupView2(GenericAPIView): # filter_backends#配置過濾字段 queryset = models.UserGroup.objects.all() serializer_class = UserGroupSerializer1#指定序列化器 pagination_class = PageNumberPagination#自定分頁類 def get(self, request, *args, **kwargs): groups = self.get_queryset() page_groups = self.paginate_queryset(groups) ser_data = self.get_serializer(instance=page_groups, many=True) ret =ser_data.data return Response(ret) def post(self,request,*args,**kwargs): ser_data = UserGroupSerializer1(data=request.data) if ser_data.is_valid(): # 序列化器校驗 ser_data.save() # 返回當前對象(序列化有instance就是更新) else: return Response(ser_data.errors) return self.get(request, *args, **kwargs) class UserGroupView22(GenericAPIView): # filter_backends#配置過濾字段 queryset = models.UserGroup.objects.all() serializer_class = UserGroupSerializer1 lookup_field = 'pk'#指定字段(默認)--獲取單個對象用 def get(self, request, *args, **kwargs): obj = self.get_object() ser_data = self.get_serializer(instance=obj,many=False) ret = ser_data.data return Response(ret) def put(self, request, *args, **kwargs): pk = kwargs.get('pk') pass def delete(self, request, *args, **kwargs): pass #3.繼承GenericViewSet的CBV寫法(注意路由的改變--請求與函數映射,函數名可自定義或採用默認,但必須對應) from rest_framework.viewsets import GenericViewSet class UserGroupView3(GenericViewSet): queryset = models.UserGroup.objects.all() serializer_class = UserGroupSerializer1 pagination_class = PageNumberPagination def list(self, request, *args, **kwargs): groups = self.get_queryset() page_groups = self.paginate_queryset(groups) ser_data = self.get_serializer(instance=page_groups, many=True) ret =ser_data.data return Response(ret) def create(self,request,*args,**kwargs): ser_data = UserGroupSerializer1(data=request.data) if ser_data.is_valid(): # 序列化器校驗 ser_data.save() # 返回當前對象(序列化有instance就是更新) else: return Response(ser_data.errors) return Response('post--create--ok!') class UserGroupView33(GenericViewSet): queryset = models.UserGroup.objects.all() serializer_class = UserGroupSerializer1 lookup_field = 'pk'#指定字段(默認)--獲取單個對象用 def retrieve(self, request, *args, **kwargs): obj = self.get_object() ser_data = self.get_serializer(instance=obj, many=False) ret = ser_data.data return Response(ret) def update(self, request, *args, **kwargs): obj = self.get_object()#獲取當前對象經過指定字段lookup_field ser_data = self.get_serializer(instance=obj,data=request.data, many=False) if ser_data.is_valid(): ser_data.save() else: return Response(ser_data.errors) return HttpResponse('put--update--ok!') def destroy(self, request, *args, **kwargs): models.UserGroup.objects.get(pk=self.lookup_field).delete() return HttpResponse('delete--destroy--ok!') #4.繼承ModelViewSet(繼承6個類)的CBV寫法(注意路由的改變--請求與函數(採用默認的類本身處理)映射)#針對簡單的增刪改查適用 from rest_framework.viewsets import ModelViewSet class UserGroupView4(ModelViewSet): queryset = models.UserGroup.objects.all() serializer_class = UserGroupSerializer1 pagination_class = PageNumberPagination lookup_field = 'pk' # 指定字段(默認)--獲取單個對象用(改/刪/查單個)注意與url中對應
settings.pypost
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api.apps.ApiConfig', 'rest_framework', ] REST_FRAMEWORK = { # 版本組件 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 設置版本組件類 'DEFAULT_VERSION': 'v1', # 默認的API版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 容許的API版本 'VERSION_PARAM': 'version', # 版本的key,默認的就是version(注意要和api接口中的key對應) # 解析器組件 'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', ], # 可指定多個解析器,不配置默認支持全部 # 分頁組件 'PAGE_SIZE': 3 }
CVB模式繼承----五層url
from django.views import View # Django的Viewspa
from rest_framework.views import APIView # drf的APIView繼承View3d
from rest_framework.generics import GenericAPIView, CreateAPIView # drf的GenericAPIView繼承APIView
# 如下CBV須要在路由的as_view()中添加對應參數---請求方式和函數的映射:無參數{'get':'list','post':'create'},帶參數{'get':'retrive'}
from rest_framework.viewsets import GenericViewSet # drf的GenericViewSet繼承ViewSetMixin和GenericAPIView,路由改變:需指定請求方法--視圖函數映射
from rest_framework.viewsets import ModelViewSet # drf的ModelViewSet繼承查(多條)、增、查(單條)、刪、改和GenericViewSet,共有一個視圖便可,路由有改變:需指定請求方法--視圖函數(默認繼承類處理)映射
通常多用APIView,對於基本的增刪改查可直接使用ModelViewSet