用法
这是一个简单的 URL conf 示例,它使用SimpleRouter
.
from rest_framework import routers
router = routers.SimpleRouter()
router.register(r'users',UserViewSet)
router.register(r'accounts',AccountViewSet)
urlpatterns = router.urls
该方法有两个强制参数register()
:
prefix
- 用于这组路由的 URL 前缀。viewset
- 视图集类。
或者,您还可以指定一个附加参数:
basename
- 用于创建的 URL 名称的基础。如果未设置 basename 将根据queryset
viewset 的属性自动生成(如果有的话)。请注意,如果视图集不包含queryset
属性,则必须basename
在注册视图集时进行设置。
上面的示例将生成以下 URL 模式:
- URL 模式:
^users/$
名称:'user-list'
- URL 模式:
^users/{pk}/$
名称:'user-detail'
- URL 模式:
^accounts/$
名称:'account-list'
- URL 模式:
^accounts/{pk}/$
名称:'account-detail'
添加路由
urlpatterns += router.urls
或
path('', include(router.urls)),
额外操作的路由
视图集可以通过使用装饰器装饰方法来标记路由的额外操作@action
。这些额外的操作将包含在生成的路由中。例如,给定类set_password
上的方法UserViewSet
:
from myapp.permissions importIsAdminOrIsSelf
from rest_framework.decorators import action
classUserViewSet(ModelViewSet):
...
@action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf])
def set_password(self, request, pk=None):
...
将生成以下路线:
- 网址格式:
^users/{pk}/set_password/$
- 网址名称:
'user-set-password'
默认情况下,URL 模式基于方法名称,并且 URL 名称是ViewSet.basename
和带连字符的方法名称的组合。如果您不想对这些值中的任何一个使用默认值,则可以改为将url_path
andurl_name
参数提供给@action
装饰器。
例如,如果您想将自定义操作的 URL 更改为^users/{pk}/change-password/$
,您可以编写:
from myapp.permissions importIsAdminOrIsSelf
from rest_framework.decorators import action
classUserViewSet(ModelViewSet):
...
@action(methods=['post'], detail=True, permission_classes=[IsAdminOrIsSelf],
url_path='change-password', url_name='change_password')
def set_password(self, request, pk=None):
...
上面的示例现在将生成以下 URL 模式:
- 网址路径:
^users/{pk}/change-password/$
- 网址名称:
'user-change_password'