Django REST framework 視圖和路由詳解
DRF中的Request
在Django REST Framework中內置的Request類擴展了Django中的Request類,實現(xiàn)了很多方便的功能--如請求數(shù)據(jù)解析和認證等。
比如,區(qū)別于Django中的request從request.GET中獲取URL參數(shù),從request.POST中取某些情況下的POST數(shù)據(jù)。
在APIView中封裝的request,就實現(xiàn)了請求數(shù)據(jù)的解析:
對于GET請求的參數(shù)我們通過request.query_params來獲取。
對于POST請求、PUT請求的數(shù)據(jù)我們通過request.data來獲取。
前提
序列化
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): # 創(chuàng)建,與具體查出某一條記錄 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): # 創(chuàng)建 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' })),
高級路由
視圖
同上
路由
from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'school', views.SchoolView) urlpatterns += router.urls
精華:流程圖
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Django 項目通過加載不同env文件來區(qū)分不同環(huán)境
這篇文章主要介紹了Django 項目如何通過加載不同env文件來區(qū)分不同環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02Django中日期時間型字段進行年月日時分秒分組統(tǒng)計
這篇文章主要介紹了Django中日期時間型字段進行年月日時分秒分組統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11Pycharm配置opencv與numpy的實現(xiàn)
本文總結了兩種方法來導入opencv與numpy包,第一種是直接在Pycharm中導入兩個包,第二種是在官網下載相關文件進行配置,感興趣的小伙伴們可以參考一下2021-07-07Python實現(xiàn)監(jiān)控程序執(zhí)行時間并將其寫入日志的方法
這篇文章主要介紹了Python實現(xiàn)監(jiān)控程序執(zhí)行時間并將其寫入日志的方法,實例分析了Python日志操作的相關技巧,需要的朋友可以參考下2015-06-06keras.layers.Layer中無法定義name的問題及解決
這篇文章主要介紹了keras.layers.Layer中無法定義name的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Python多線程編程(八):使用Event實現(xiàn)線程間通信
這篇文章主要介紹了Python多線程編程(八):使用Event實現(xiàn)線程間通信,,需要的朋友可以參考下2015-04-04cv2.imread?和?cv2.imdecode?用法及區(qū)別
對于路徑中含有中文的圖像,直接用cv2.imread讀取會報錯,上次看到有大佬使用cv2.imdecode就可以正常讀取,有點好奇,所以今天來記錄下二者用法和區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-02-02