目录
二、ViewSetMixin - 重写as_view,拦截分发至指定方法
一、原始方式
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()), ] ''' 视图函数 ''' # -----------基于restful的增删改 -------------- class PublishView(APIView): def get(self, request): publish_list = models.Publish.objects.all() ser = MySerializer.PublishSerializers(publish_list, many=True) return JsonResponse(ser.data, safe=False) def post(self, request): ser = MySerializer.PublishSerializers(data=request.data) if ser.is_valid(): ser.save() return JsonResponse(ser.data, safe=False) else: return JsonResponse(ser.errors, safe=False) class PublishDetailView(APIView): def get(self, request, pk): publish_obj = models.Publish.objects.filter(pk=pk).first() ser = MySerializer.PublishSerializers(publish_obj, many=False) return JsonResponse(ser.data, safe=False) def put(self, request, pk): publish_obj = models.Publish.objects.filter(pk=pk).first() ser = MySerializer.PublishSerializers(data=request.data, instance=publish_obj) if ser.is_valid(): ser.save() return JsonResponse(ser.data, safe=False) else: return JsonResponse(ser.errors, safe=False) def delete(self, request, pk): models.Publish.objects.filter(pk=pk).delete() return JsonResponse("delete", safe=False)
二、ViewSetMixin - 重写as_view,拦截分发至指定方法
2-1 路由设计
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ # 基于ViewSetMixin url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})), url(r'^publish/(?P<pk>\d+)', views.PublishView.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'})), ] ''' PublishView类内包含list、create、retrieve、update、destory等方法 get请求-list方法,post请求-create方法 .PublishView.as_view({'get': 'list', 'post': 'create'}) get请求-retrieve方法,put请求-update方法,delete请求-destory方法 .PublishView.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'}) ''' from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test1/$', views.TestAll.as_view({'get': 'test'})), url(r'^test2/$', views.TestAll.as_view({'get': 'test2'})), url(r'^test3/$', views.TestAll.as_view({'get': 'test3'})), url('', include(router.urls)), ] ''' test1 - 触发test方法 test2 - 触发test2方法 test3 - 触发test3方法 '''
2-2 视图函数
''' !!注意!!由于viewSetMixin重写了as_view方法和APIView内冲突,所以继承时必须前置 ''' class PublishView(ViewSetMixin,APIView): def list(self, request, *args, **kwargs): pass def create(self, request, *args, **kwargs): pass def retrieve(self, request, *args, **kwargs): pass def update(self, request, *args, **kwargs): pass def destroy(self, request, *args, **kwargs): pass
三、routers自动生成路由(不推荐使用)
3-2 路由设计
from django.conf.urls import url,include from django.contrib import admin from app01 import views from rest_framework import routers # 生成一个router对象 router=routers.DefaultRouter() # 需要传两个参数,第一个参数就是匹配的路径,第二个参数,是视图类 # publish匹配PublishView视图函数 router.register('publish',views.PublishView) # !!!注意!!!PublishView方法必须继承于ModelViewSet urlpatterns = [ url(r'^admin/', admin.site.urls), url('', include(router.urls)), ]