当前位置:   article > 正文

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

django view中的action
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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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'})),
    ...
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

特别注意: 如果路由列表里使用的是re_path(),一定要注意不能以$结尾,否则匹配不正确,因为它要与pk或尾缀拼接

3.路由

在ViewSet视图集,我们除了可以使用action进行映射之外,还可以使用Routers路由,DRF主要提供了SimpleRouter和DefaultRouter两种路由

用法

from rest_framework import routers  # 导包
router = routers.SimpleRouter()  # 使用简单路由
register(prefix, viewset, base_name)  #注册
  • 1
  • 2
  • 3

参数说明
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) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

SimpleRouter和DefaultRouter区别不大,可参考下面两张对比图
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44633
推荐阅读
相关标签
  

闽ICP备14008679号