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)
努力生活,融于自然