【Django】DRF的ViewSet视图集、action装饰器、Routers路由

1.重要的视图集

视图集 说明
ViewSetMixin 重写self.as_view()函数,传入字典指定请求方式映射的视图函数
ViewSet 继承ViewSetMixinAPIView,提供了身份认证、权限校验、流量管理等
ModelViewSet 继承五大拓展类GenericAPIView,提供增删改查接口
self.list()self.create()self.retrieve()self.update()self.partial_update()self.destroy()
GenericViewSet 继承ViewSetMixinGenericAPIView
ReadOnlyModelViewSet 继承拓展类RetrieveModelMixinListModelMixinGenericAPIView;提供只读接口
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区别不大,可参考下面两张对比图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39147299/article/details/108756994