django rest framework------得心应手
Warninig:本文僅適用小白,老手請繞道
總共,分三步
對于一個從未接觸的新事物來說,我偏向于先看看他的外表,再一層一層扒掉它的外衣。
所以,這次,我們自頂向下的來看django rest framework是如何實現restful api的。
在django rest framework下提供restful api 總共分三步:
首先在viwe.py文件實現GoodsListViewSet如下:
from rest_framework import mixins from rest_framework import viewsetsclass GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):queryset = Goods.objects.all() # 獲取待返回數據的querysetserializer_class = GoodsSerializer # 指定序列化器接著,在serilaizers.py文件中實現GoodsSerializer如下:
from rest_framework import serializers from goods.models import Goodsclass GoodsSerializer(serializers.ModelSerializer): class Meta:model = Goods fields = '__all__'最后,在url.py文件中配置路由信息如下:
from rest_framework.documentation import include_docs_urls from rest_framework.routers import DefaultRouterrouter = DefaultRouter() router.register(r'goods', GoodsListViewSet, base_name="goods")urlpatterns = [url(r'^', include(router.urls)) ]好了。
現在已經可以通過瀏覽器中輸入域名/goods 來獲取goods的所有數據了,以json格式展現。
django rest framework還為我們處理了json數據,以便更好的展示
?
然后呢?只是這樣嗎?
到底強大在哪里呢?
我也不知道,我覺得吧,這得結合具體的業務才能評判。
所以今天,我們來看下django rest framework到底是怎么實現restful api的
難道你們不好奇嗎。
?
還得從mixins.ListModelMixin和viewsets.GenericViewSet講起
?
通過各種類的層層繼承,django rest framework為我們做了很多事。
導致我們只需要繼承相應的類以及適當的重載某些特性,即可實現所需的功能
我們看到,在view.py文件中,GoodsListViewSet類本身并沒有指定任何方法來響應http請求
但是他繼承了兩個類。
我們先進入viewsets.GenericViewSet的定義看看:
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 asthe `get_object` and `get_queryset` methods."""pass啥也沒有,只是繼承了另外兩個類............
于是我們再來看下ViewSetMixin的定義:
class ViewSetMixin(object):"""This is the magic.Overrides `.as_view()` so that it takes an `actions` keyword that performsthe binding of HTTP methods to actions on the Resource.For example, to create a concrete view binding the 'GET' and 'POST' methodsto the 'list' and 'create' actions...view = MyViewSet.as_view({'get': 'list', 'post': 'create'})"""............代碼有很多,我一行也沒考,但是從這個說明中以及可以看出一些東西了,下面,我用我CET6的水平為大家翻譯一下。
這是一個魔法(這么自戀?!)。
我們重寫了as_view(),實現了http請求到對資源的各種操作的綁定。
舉個栗子,我們將http的get,post請求分別綁定到了list,creat上去......
emmmmm,貌似有點明白了.......
但是list,creat方法又是在哪里實現的呢?
沒錯,正是mixins.ListModelMixin
class ListModelMixin(object):"""List a queryset."""def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)mixins.ListModelMixin實現了list操作,那么creat呢?
沒錯,是mixins.CreateModelMixin,實際上mixins.xxxxModelMixin共有5個,分別對應了不同的操作,需要時只要在類定義中繼承即可。
至此,邏輯已經很清楚了。
我再來看看那個不起眼的generics.GenericAPIView到底干了啥:
class GenericAPIView(views.APIView):"""Base class for all other generic views."""# You'll need to either set these attributes,# or override `get_queryset()`/`get_serializer_class()`.# If you are overriding a view method, it is important that you call# `get_queryset()` instead of accessing the `queryset` property directly,# as `queryset` will get evaluated only once, and those results are cached# for all subsequent requests.queryset = Noneserializer_class = None同樣,我們只看說明。
他讓我們重置queryset 和serializer_class這兩個attributes,或者重載get_queryset()和get_serializer_class()這兩個方法
從名字中看的出來,是和序列化相關的。
所以我們明白了,GoodsListViewSet繼承了兩個類,一個指定了http請求的響應方法,一個指定了數據的序列化方法。
我們來看個結構圖:
完美~
?
?
?
?
?
轉載于:https://www.cnblogs.com/jiage666/p/9599683.html
總結
以上是生活随笔為你收集整理的django rest framework------得心应手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ant Design离线使用Icon图标
- 下一篇: GIS输出PDF为什么标注有问题