Django - DRF路由组件

  • 作者:lwj
  • 分类:Django
  • 发表日期:2021-12-05 13:53:17
  • 阅读(43)
  • 评论(0)

Django除了path、re_path和url三个方法可以注册路由之外,还可以通过DRF路由组件注册路由

DRF提供了两个注册路由对象(SimpleRouterDefaultRouter)

注:SimpleRouterDefaultRouter只有一个区别,DefaultRouter会对生成一个根路由(DefaultRouter继承SimpleRouter)

DRF路由注册

from django.urls import re_path
from rest_framework.routers import DefaultRouter, SimpleRouter

from . import views

urlpatterns = [
    # django的as_view的actions参数传参的key为申明请求方式,value则申明BookViewSet类试图的处理方法
    re_path(r"^BookViewSet/(?P<pk>\d+)$", views.BookViewSet.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

# 创建路由器
route = DefaultRouter()
# 注册路由
route.register(prefix=r"BookModelViewSet", viewset=views.BookModelViewSet, basename="bookinfo")
# 把生成好的路由拼接到urlpatterns中
urlpatterns += route.urls
注:DRF的路由组件只能结合视图集一起使用
register方法的basename参数可以不指定。他模式会找视图集中queryset属性所指定查询集对应模型名小写作为路由别名前缀,但是如果没有queryset,就必须给basename指定参数传递不然或报错

DRF路由组件创建路由器默认只为增删改查行为生成路由信息,如果想让自定义的行为(动态增加路由)也生成路由需要在自定义行为上用actions装饰

如下代码中,申明对http://127.0.0.1:8000/BookModelViewSet/latest发起GET请求时,BookModelViewSetlatest方法处理请求

from rest_framework.viewsets import ModelViewSet
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.decorators import action

from .models import BookInfo
from .serializers import BookInfoSerializers

# ModelViewSet视图集
class BookModelViewSet(ModelViewSet, GenericAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializers

    @action(methods=["get"], detail=False)
    def latest(self, request):
        book = self.get_queryset().last()
        serializer = self.get_serializer(instance=book)
        return Response(serializer.data)
action装饰器提供了两个参数(methods和detail)
methods: 声明该action对应的请求方式,列表传递
detail: 声明该action的路径是否与单一资源(详情视图)对应,及是否是xxx/<pk>/action方法名/
   detail=True表示是详情视图,请求的路径是:http://127.0.0.1:8000/BookModelViewSet/pk/latest
   detail=False表示是列表视图,请求的路径是:http://127.0.0.1:8000/BookModelViewSet/latest
觉得不错,支持一下!

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论
返回顶部

建议反馈

1. 可在博文底部留言评论

2. 发邮件到i_suichuan@163.com