django restframework框架八 路由
@(python之路)[django restframework框架八 路由]
django restframework框架八 路由
目錄
路由組件
?一般路由我們會寫六個方法:
- 列表:SaView.get
- 添加:SaView.post
- 詳細:SaView.get
- 修改:SaView.put
- 局部:SaView.patch
- 刪除:SaView.delete
一般的路由都是有這六部分組成
路由組件編寫
a. 自定義路由
urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'sa/$', views.SaView.as_view()),
url(r'sa/(?(pk)\d+)/$', views.SaView.as_view()),
]
views.py
class SaSerialiser(serializers.ModelSerializer):
class Meta:
model = models.Sa
fields = "__all__"
class SaView(APIView):
authentication_classes = []
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if not pk:
queryset = models.Sa.objects.all()
ser = SaSerialiser(instance=queryset,many=True)
else:
obj = models.Sa.objects.filter(id=pk).first()
ser = SaSerialiser(instance=obj, many=False)
return Response(ser.data)
def post(self,request,*args,**kwargs):
pass
def put(self,request,*args,**kwargs):
kwargs.get('pk')
pass
def patch(self,request,*args,**kwargs):
kwargs.get('pk')
pass
def delete(self,request,*args,**kwargs):
kwargs.get('pk')
pass
弊端:視圖函數做修改,這里也需要做修改
b. 半自動路由
urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'sa/$', views.SaView.as_view({'get': 'list', 'post': 'create'})),
url(r'sa/(?(pk)\d+)/$', views.SaView.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
]
此時我們的views就要換一種方式了
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from .. import models
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserViewSet(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = UserSerializer
c. 全自動路由
urls.py
from django.conf.urls import url, include
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'sa', views.SaView)
urlpatterns = [
url(r'^', include(router.urls)),
]
views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from .. import models
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
fields = "__all__"
class UserViewSet(ModelViewSet):
queryset = models.UserInfo.objects.all()
serializer_class = UserSerializer
不推薦這種方式
源碼分析
1
from rest_framework.viewsets import GenericViewSet
class SaView(APIView):
pass
我們來看一下GenericViewSet
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
pass
這里GenericViewSet繼承了ViewSetMixin和generics.GenericAPIView
這里我們先看一下generics.GenericAPIView
class GenericAPIView(views.APIView):
queryset = None
serializer_class = None
lookup_field = 'pk'
lookup_url_kwarg = None
filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
def get_queryset(self):
assert self.queryset is not None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__
)
# 這里的本質就是 self.queryset= queryset = None;
# 這里單純的它是沒有意義的。我們需要結合其他的來用。他是用來調用增刪改查的。稍后會仔細說。
queryset = self.queryset
if isinstance(queryset, QuerySet):
# Ensure queryset is re-evaluated on each request.
queryset = queryset.all()
return queryset
?我們現在來看,GenericAPIView并沒有起到什么作用。所以我們繼續看ViewSetMixin。
class ViewSetMixin(object):
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
pass
我們關注的是as_view()他這里需要重新寫了as_view方法。所以我們的路由也要跟著改變。語言來的變化請看b
2
ModelViewSet:代碼示例請看c
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
pass
我們發現他繼承了五個類,

浙公網安備 33010602011771號