1.重要的视图集
视图集 | 说明 |
---|---|
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() |
2.action装饰器
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或尾缀拼接
3.路由
在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区别不大,可参考下面两张对比图