Django之DRF框架學習(Django REST framework)——視圖集
試圖集ViewSet
介紹ViewSet
- list() 提供一組數據
- retrieve() 提供單個數據
- create() 創建數據
- update() 保存數據
- destory() 刪除數據
ViewSet視圖集不再實現get(),post()等方法,而是實現動作action如list(),create()等。視圖集只在使用as_view()方法的時候,才會將action動作與具體請求方式對應上。
視圖集存在的意義:
- 將所有的接口可以寫在一個類試圖中(類試圖中的方法不再用請求方法名小寫 行為/動作 list/create)
- 重寫了as_view({‘get’:‘list’, ‘post’:‘create’})
使用ViewSet開發api案例
1.views.py
'''使用試圖集的ViewSet開發api'''
class BookViewSet(ViewSet):
def list(self, request):
qs = BookInfo.objects.all()
serializer = BookInfoModelSerializer(instance=qs, many=True)
return Response(serializer.data)
def retrieve(self, request, pk):
try:
book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
Response(status=status.HTTP_404_NOT_FOUND)
serializer = BookInfoModelSerializer(instance=book)
return Response(serializer.data)
2.urls.py
from django.conf.urls import url
from . import views
# 視圖集路由
url(r'^books/$', views.BookViewSet.as_view({'get':'list'})),
url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get':'retrieve'}))
使用使用GenericViewSet + Mixin開發api案例
1.views.py
from booktest.models import BookInfo,HeroInfo
from .serializers import BookInfoModelSerializer,HeroInfoModelSerializer
from rest_framework.mixins import ListModelMixin,CreateModelMixin,DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin
from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet,ModelViewSet
'''使用GenericViewSet + Mixin開發api'''
class BookViewSet( DestroyModelMixin, CreateModelMixin, UpdateModelMixin, ReadOnlyModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
附加viewsset的部分源碼,其實ReadOnlyModelViewSet 包含了 GenericViewSet 與 ListModelMixin 與 RetrieveModelMixin
class ViewSet(ViewSetMixin, views.APIView):
"""
The base ViewSet class does not provide any actions by default.
"""
pass
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
"""
The GenericViewSet class does not provide any actions by default,
but does include the base set of generic view behavior, such as
the `get_object` and `get_queryset` methods.
"""
pass
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `list()` and `retrieve()` actions.
"""
pass
- urls.py
from django.conf.urls import url
from . import views
# 視圖集路由
url(r'^books/$', views.BookViewSet.as_view({'get':'list', 'post': 'retrieve'})),
url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({'get':'retrieve', 'delete':'destroy', 'put':'update'}))
最牛逼的一種開發api方式(使用ModelViewSet + 自動注冊路由)
- views.py
'''最叼繼承 ModelViewSet'''
class BookViewSet( ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
- urls.py
from rest_framework.routers import DefaultRouter
urlpatterns = [
]
router = DefaultRouter() # 創建路由器
router.register(r'book', views.BookViewSet) #注冊路由
urlpatterns += router.urls
自定義視圖(自己定義的邏輯)
1.views.py
@action(methods=[指定下面的行為接受什么請求], detail=是不是詳情視圖,詳情視圖為True,生成路由books/pk/latest,列表視圖為False,生成路由books/latest)
from booktest.models import BookInfo,HeroInfo
from .serializers import BookInfoModelSerializer,HeroInfoModelSerializer
from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet,ModelViewSet
# 用于urls.py自動創建自定義視圖的路由
from rest_framework.decorators import action
class BookViewSet( ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
@action(methods=['get'], detail=False)
def latest(self, request):
book = BookInfo.objects.latest('id')
serializer = self.get_serializer(book)
return Response(serializer.data)
@action(methods=['put'], detail=True)
def read(self, request, pk):
'''修改圖書的數量'''
book = self.get_object()
book.bread = request.data.get('bread')
book.save()
serializer = self.get_serializer(book)
return Response(serializer.data)
2.urls.py
創建路由器(!!!路由器只可以結合試圖集一塊用!!!)默認只生成標準的增刪改查,如果想生成自定義的路由需要在views.py的自定義視圖上添加裝飾器action(from rest_framework.decorators import action)
!!!路由器只可以結合試圖集一塊用!!!
!!!路由器只可以結合試圖集一塊用!!!
!!!路由器只可以結合試圖集一塊用!!!
from rest_framework.routers import DefaultRouter,SimpleRouter
urlpatterns = [
]
router = DefaultRouter() # 創建路由器
router.register(r'book', views.BookViewSet, base_name='bookinfo') #注冊路由
urlpatterns += router.urls
DefaultRouter與SimpleRouter的區別: DefaultRouter可以自動生成根視圖不報錯
謝謝觀看~
智能推薦
Django Rest_Framework(DRF)
文章目錄 一、主要內容 1、web開發模式 2、API接口 3、接口測試工具:Postman 4、序列化 5、Restful規范(重點) 6、Django Rest_Framework(drf) 7、drf環境安裝與配置 7.1 安裝DRF 7.1.1 創建django項目 7.2 添加rest_framework應用 7.3 體驗drf完全簡寫代碼的過程(了解) 7.3.1. 創建模型操作類 7...
Django REST framework - View 視圖
APIView APIView是rest framework中最常用也是最基本的一個視圖。APIView繼承自Django的View視圖,并對Django的原生request進行了一些封裝,主要封裝了驗證、權限、節流三部分。 先看一下APIView中驗證、權限、節流的流程是怎樣的 驗證 rest framework提供了一個驗證的基類與4個驗證類 如果想要自己實現驗證方法,可以通過繼承BaseAu...
Django rest framework之視圖組件
文章目錄 1、視圖組件 1.1、作用 1.2、視圖繼承關系 1.3、視圖的方法與屬性 2、2個視圖基類 2.1、APIView 2.1.1、APIView與View的不同之處 2.1.2、支持定義的類屬性 2.2、GenericAPIView[通用視圖類] 2.2.1、屬性 2.2.1.1、serializer_class 指明視圖使用的序列化器 2.2.2、方法 2.2.2.1、get_seri...
Django之Rest Framework
Rest Framework Rest Framework是前后端分離中的一種規范,它與框架本身無關,是一種軟件架構風格,全稱為Representational State Transfer。 Rest Framework最顯著的特點就是將一切數據看作資源,同時對不同的請求方式做出不同的責任劃分。這種結構理念也被稱為面向資源架構。 前后端分離 不同于前后端混合開發中的接口,API接口主要用于為頁面...
django rest framework學習
1. 引入DjangoRESTframework 1.1 Web應用模式 前后端不分離 前后端分離 1.2 認識RESTful 在前后端分離的應用模式里,API接口如何定義? 對于接口的請求方式與路徑,每個后端開發人員可能都有自己的定義方式,風格迥異。 是否存在一種統一的定義方式,被廣大開發人員接受認可的方式呢? 這就是被普遍采用的API的RESTful設計風格。 例如對于后端數據庫中保存了商品的...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...