Django REST framework 視圖和路由

DRF中的Request

在Django REST Framework中內置的Request類擴展了Django中的Request類,實現了不少方便的功能--如請求數據解析和認證等。app

好比,區別於Django中的request從request.GET中獲取URL參數,從request.POST中取某些狀況下的POST數據。post

在APIView中封裝的request,就實現了請求數據的解析:ui

對於GET請求的參數咱們經過request.query_params來獲取。url

對於POST請求、PUT請求的數據咱們經過request.data來獲取。spa

前提

序列化

from rest_framework import serializers
from app01 import models


class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Comment
        fields = "__all__"
        extra_kwargs = {
            "content": {"error_messages": {"required": "評論內容不能爲空"}},
            "article": {"error_messages": {"required": "文章不能爲空"}}
        }


class SchoolSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.School
        fields = "__all__"

第一階段:手壘代碼

視圖

from rest_framework.views import APIView
class SchoolView(APIView):
    def get(self, request, *args, **kwargs):
        query_set = models.School.objects.all()
        ser_obj = app01_serializers.SchoolSerializer(query_set, many=True)
        return Response(ser_obj.data)


class SchoolDetail(APIView):
    def get(self, request, pk, *args, **kwargs):
        obj = models.School.objects.filter(pk=pk).first()
        ser_obj = app01_serializers.SchoolSerializer(obj)
        return Response(ser_obj.data)

 

第二階段:簡單使用rest formwork自帶混合類方法

視圖

from rest_framework.generics import GenericAPIView  # 公共類
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin  # 混合類  必須與公共類搭配着使用
class SchoolView(GenericAPIView, mixins.ListModelMixin): # 查看學校列表 queryset = models.School.objects.all() serializer_class = app01_serializers.SchoolSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) class SchoolDetail(GenericAPIView, mixins.RetrieveModelMixin, mixins.CreateModelMixin): # 建立,與具體查出某一條記錄 queryset = models.School.objects.all() serializer_class = app01_serializers.SchoolSerializer def get(self, request, pk, *args, **kwargs): return self.retrieve(request, pk, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs)

路由

url(r'school/$', views.SchoolView.as_view()),
url(r'school/(?P<pk>\d+)/$', views.SchoolDetail.as_view()),

第三階段:使用rest formwork自帶的通用類方法

視圖

from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateAPIVie
class SchoolView(ListCreateAPIView):  # 建立
    queryset = models.School.objects.all()
    serializer_class = app01_serializers.SchoolSerializer


class SchoolDetail(RetrieveUpdateDestroyAPIView):  # 更新
    queryset = models.School.objects.all()
    serializer_class = app01_serializers.SchoolSerializer

路由同上

第四階段:使用rest formwork自帶的封裝全部放的類,代碼量最少,功能最全

視圖

from rest_framework.viewsets import ModelViewSet  # 裏面封裝了操做的全部方法,增刪改查查
class SchoolView(ModelViewSet):
    queryset = models.School.objects.all()
    serializer_class = app01_serializers.SchoolSerializer

路由

url(r'school/$', views.SchoolView.as_view(actions={
    "get": "list",
    "post": "create",
})),
url(r'school/(?P<pk>\d+)/$', views.SchoolView.as_view(actions={
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy'
})),

 

高級路由

視圖

同上rest

路由

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'school', views.SchoolView)
urlpatterns += router.urls

 

精華:流程圖

 

actions
相關文章
相關標籤/搜索