我一直在研究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"
})
使用poster,我可以访问端点example.com/testing并注销json响应。然而,我试着点击example.com/users/create,得到了404。我认为在向路由器注册视图集时,basename
属性会将该类中的所有方法分组在该路由路径下,然后这些方法都将是它们自己的端点。我是不是想错了?任何帮助都将是可爱的,因为我是Django的新手。我大部分时间都做过《快报》和《拉拉威尔》。谢谢
您没有将路由器转换为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
。