DRF视图集路由

一. 简介

对于视图集ViewSet,我们有两种方法来实现路由列表信息

1)手动指明请求方式与动作action之间的对应关系

2)使用Routers来帮助我们快速实现路由列表信息

二. 使用方法

from rest_framework.routers import DefaultRouter
from django.urls import path, include

router = DefaultRouter()
router.register(r'books', BookViewSet, basename='book')

urlpatterns += router.urls
或者写成
urlpattern = [
  path('',include(router.urls))
]

语法为register(prefix, viewset, basename)

prefix: 该视图集的路由前缀
viewset:视图集
basename: 路由别名前缀,一般和prefix一样

三. action的用法

action装饰器可以接收两个参数:

methods: 声明该action对应的请求方式,列表传递

detail: 声明该action的路径是否与单一资源对应

  • True 表示路径格式是xxx/<pk>/action方法名/
  • False 表示路径格式是xxx/action方法名/
class BookInfoViewSet(ModelViewSet):
    """增删改查图书信息"""

    # 指定查询集
    queryset = BookInfo.objects.all()
    # 指定序列化器
    serializer_class = BookInfoModelSerializer

    # detail为False 表示路径名格式应该为 books/latest/,其中不包含pk
    @action(methods=['get'], detail=False)
    def latest(self, request):
        """
        自定义action动作
        返回最后一条图书信息
        """
        book = BookInfo.objects.latest('id')
        serializer = self.get_serializer(book)
        return Response(serializer.data)

例子2,有url_path参数。detail=False表示分类id不需要,后面的url_path是定义了路由路径,这样就不会用函数名作为路径了

# 商品分类
from rest_framework.decorators import action
from rest_framework import mixins

class CategoryViewSet(CmsBaseView,viewsets.ModelViewSet):
  queryset = GoodsCategory.objects.all()
  serializer_class = GoodsCategorySerializer

  # 自定义根据商家ID,获取分类
  @action(['GET'], detail=False, url_path="merchant/(?P<merchant_id>\d+)")
  def merchant_category(self,request,merchant_id=None):
    queryset = self.get_queryset()
    categories = queryset.filter(merchant=merchant_id)
    serializer = GoodsCategorySerializer(categories,many=True)
    return Response(serializer.data)
posted @ 2022-10-18 14:58  坚强的小蚂蚁  阅读(36)  评论(0编辑  收藏  举报