【问题标题】:How to route to specific viewset methods Django如何路由到特定的视图集方法 Django
【发布时间】:2021-11-05 20:12:05
【问题描述】:

我一直在研究 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。谢谢!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,这很有帮助,也很好解释
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2018-07-22
    • 2021-02-16
    • 2010-09-15
    • 2018-02-21
    • 2020-02-15
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多