• Django-rest-framework(四)router


    在上一节viewsets中,我们提到了route的方式使用,在这一节,我们将仔细介绍drf 的router机制。简单来说,router的作用就是将viewset对象的url映射关系提取出来。

    简单使用

    from rest_framework import routers
    
    router = routers.SimpleRouter()
    router.register(r'users', UserViewSet, basename="user")
    router.register(r'accounts', AccountViewSet)
    # urlpatterns = router.urls
    urlpatterns = [
        url(r'^api/', include((router.urls, 'app_name'))),
    ]
    

    register 用两个参数,

    • prefix route中url的前缀
    • viewset 对应的viewset类
    • basename 创建url的名字,默认是viewset的queryset,所以如果viewset类中没用queryset属性,必须设置basename

    额外的action

    在之前的介绍中,我们知道, viewset里面我们可以通过继承不同的mixins来实现列表,详情,增加,修改,部分修改,删除种不同功能的接口。可是在实际情况中,我们需要的不仅仅是这些,所以,我们需要额外的url来路由。于是引入了action装饰器,我们可以在viewset中添加额外的路由了,使用方法:

    from myapp.permissions import IsAdminOrIsSelf
    from rest_framework.decorators import action
    
    class UserViewSet(ModelViewSet):
        ...
    
        @action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf])
        def set_password(self, request, pk=None):
    
    Note
    在之前旧的版本使用的是detail_route,list_route连个装饰器来添加额外的路由,用来区别url中是否有pk字段。action装饰器则是通过detail字段来区别
    

    使用上面action生成的url是 ^users/{pk}/set_password/$。 如果不想使用方法的名字来做路由,可以在action中指定url_name

    DefaultRouter

    前面我们介绍时使用的是SimpleRouterDefaultRouter与之不同的是,它带了一个api root view,返回了包viewset中包含的所有action的超链接。

    官方文档上还介绍了自定义routers的方法,因为暂时还没用到过,所以对这部分不做介绍

  • 相关阅读:
    BZOJ4896 THUSC2016补退选(trie)
    BZOJ4892 Tjoi2017dna(后缀数组)
    BZOJ4890 Tjoi2017城市
    BZOJ4888 Tjoi2017异或和(树状数组)
    BZOJ4887 Tjoi2017可乐(动态规划+矩阵快速幂)
    BZOJ4883 棋盘上的守卫(环套树+最小生成树)
    BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
    BZOJ4878 挑战NP-Hard(dfs树)
    BZOJ5466 NOIP2018保卫王国(倍增+树形dp)
    BZOJ4873 Shoi2017寿司餐厅(最小割)
  • 原文地址:https://www.cnblogs.com/yuzhenjie/p/10361880.html
Copyright © 2020-2023  润新知