如何路由到特定的视图集方法 Django

How to route to specific viewset methods 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"
    })

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

您没有将您的路由器转换为 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 方法在 [=14 期间执行=] 请求特定的 uri。在您的情况下,此 uri 将是 /users.

如果您想添加一个在 /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.