赞
踩
| 视图集 | 说明 |
|---|---|
| ViewSetMixin | 重写self.as_view()函数,传入字典指定请求方式映射的视图函数 |
| ViewSet | 继承ViewSetMixin和APIView,提供了身份认证、权限校验、流量管理等 |
| ModelViewSet | 继承五大拓展类和GenericAPIView,提供增删改查接口 self.list()、 self.create()、 self.retrieve()、 self.update()、 self.partial_update()、 self.destroy() |
| GenericViewSet | 继承ViewSetMixin和GenericAPIView |
| ReadOnlyModelViewSet | 继承拓展类RetrieveModelMixin、ListModelMixin和GenericAPIView;提供只读接口 self.list()、 self.create() |
Django默认的路由分发规则决定了视图函数只能以get、post等请求方式命名,如果想要使用自定义的方式命名,我们可以使用action去映射请求方法名与自定义方法
views.py
from rest_framework.decorators import action from rest_framework.generics import RetrieveAPIView, UpdateAPIView, DestroyAPIView from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from .models import BookInfo from .serializers import BookInfoModelSerializer # re_path(r'^books/$',views.BooksView.as_view()), class BooksView(ModelViewSet): queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer # 自定义一个视图函数,需求是获取一本最新的书 # GET /books/latest/ # methods: 映射的请求方式 # url_path:路径拼接尾缀,默认是函数名 # detail: # True:前缀(prefix)+pk正则分组+尾缀(url_path) # False:前缀(prefix)+尾缀(url_path) @action(methods=['get'],detail=False,url_path='latest') def latest(self,request,*args,**kwargs): book = self.queryset.latest('bpub_date') serializer = self.get_serializer(instance=book) return Response(data=serializer.data) # re_path(r'^book/(?P<pk>\d+)/$',views.BookView.as_view()) class BookView(RetrieveAPIView,UpdateAPIView,DestroyAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer
models.py
from django.urls import path,re_path
from booktest.views import BooksView
from . import views
urlpatterns = [
# re_path(r'^books/$',views.BooksView.as_view()),
re_path(r'^books/',views.BooksView.as_view({'get':'latest'})),
...
]
特别注意: 如果路由列表里使用的是re_path(),一定要注意不能以$结尾,否则匹配不正确,因为它要与pk或尾缀拼接
在ViewSet视图集,我们除了可以使用action进行映射之外,还可以使用Routers路由,DRF主要提供了SimpleRouter和DefaultRouter两种路由
用法
from rest_framework import routers # 导包
router = routers.SimpleRouter() # 使用简单路由
register(prefix, viewset, base_name) #注册
参数说明
prefix :路由前缀
viewset:要被访问的视图集
base_name:路由名称的前缀
改写上面的action路由方式
from django.urls import path,re_path
from rest_framework.routers import SimpleRouter
from booktest.views import BooksView
from . import views
urlpatterns = [
# re_path(r'^books/$',views.BooksView.as_view()),
# re_path(r'^books/',views.BooksView.as_view({'get':'latest'})),
...
]
router = SimpleRouter() # 实例化一个简单路由
router.register(prefix='books', viewset=BooksView, base_name='books') # 注册路由
urlpatterns += router.urls # 合并到urlpatterns列表里
# 或 urlpatterns.extend(router.urls)
SimpleRouter和DefaultRouter区别不大,可参考下面两张对比图

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。