DRF視圖組件

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)
models.py:

urls.py
session

 

drf主路由配置urls.py  app

from django.conf.urls import url,include
urlpatterns = [
    url(r'^api/', include('api.urls')),
]
drf主路由配置urls.py:

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
 
]
 
api主路由配置urls.py:

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中對應
views.py:

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
 
}
settings.py

 

 

 

CVB模式繼承----五層url

from django.views import View  # DjangoViewspa

from rest_framework.views import APIView  # drfAPIView繼承View3d

from rest_framework.generics import GenericAPIView, CreateAPIView  # drfGenericAPIView繼承APIView

# 如下CBV須要在路由的as_view()中添加對應參數---請求方式和函數的映射:無參數{'get':'list','post':'create'},帶參數{'get':'retrive'}

from rest_framework.viewsets import GenericViewSet  # drfGenericViewSet繼承ViewSetMixinGenericAPIView,路由改變:需指定請求方法--視圖函數映射

from rest_framework.viewsets import ModelViewSet  # drfModelViewSet繼承查(多條)、增、查(單條)、刪、改和GenericViewSet,共有一個視圖便可,路由有改變:需指定請求方法--視圖函數(默認繼承類處理)映射

 

通常多用APIView,對於基本的增刪改查可直接使用ModelViewSet

相關文章
相關標籤/搜索