首页 > 解决方案 > 如何路由到特定的视图集方法 Django

问题描述

我一直在研究 Django 的视图集和路由器文档,但我不知道如何设置路由来访问视图集上的方法。

例如,这是我的 urls.py:

from rest_framework.routers import DefaultRouter
from users.views import (UserViewSet, testing)


router = DefaultRouter()    
router.register(r"users", UserViewSet, basename="users")
    
    
urlpatterns = [
    path('testing', testing)
]

然后这是我的用户目录中的视图文件

@csrf_exempt
class UserViewSet:
    def create(self):
        return JsonResponse({
            'the create endpoint'
        })


@csrf_exempt
def testing(request):
    return JsonResponse({
        "title": "My json res"
    })

使用邮递员,我可以点击端点 example.com/testing 并注销 json 响应。但是,我尝试点击 example.com/users/create 并得到 404。我认为向basename路由器注册视图集时的属性会将该类中的所有方法分组在该路由路径下,然后这些方法将全部是他们自己的端点。我想错了吗?任何帮助都会很可爱,因为我是 Django 的新手。我主要完成了 Express 和 Laravel。谢谢!

标签: pythondjangodjango-rest-framework

解决方案


您没有将路由器转换为urlpatterns列表,因此无论如何您都无法访问您的视图集。

转换路由器:

from rest_framework.routers import DefaultRouter
from users.views import (UserViewSet, testing)

router = DefaultRouter()    
router.register(r"users", UserViewSet, basename="users")
    
urlpatterns = [
    path('testing', testing),
    *router.urls,
]

Django Rest Framework中,视图集的create方法在POST对特定 uri 的请求期间执行。在您的情况下,此 uri 将是/users.

如果你想添加一个额外的触发 at 的方法/users/create,你需要使用action装饰器:

from rest_framework import viewsets
from rest_framework.response import JsonResponse

class UserViewSet(viewsets.ViewSet):
    @action(methods=['GET'], url_path='create')
    def my_custom_action(self):
        return JsonResponse({
            'the create endpoint'
        })

由于create是 DRF 视图集上的保留方法,因此您需要将该方法命名为其他名称(在示例中为my_custom_action),并url_path相应地设置参数。

如果您省略url_path,则路径将默认为方法的名称,例如。/users/my_custom_action.


推荐阅读