Django rest framework 无PK的DRF详细路线
我想创建一个细节路由来呈现当前用户的数据 如果我使用自定义路由器:Django rest framework 无PK的DRF详细路线,django-rest-framework,Django Rest Framework,我想创建一个细节路由来呈现当前用户的数据 如果我使用自定义路由器: class CustomRouter(routers.DefaultRouter): def __init__(self, *args, **kwargs): super(CustomRouter, self).__init__(*args, **kwargs) self.routes.append( routers.Route(url=r'^{prefix}/c
class CustomRouter(routers.DefaultRouter):
def __init__(self, *args, **kwargs):
super(CustomRouter, self).__init__(*args, **kwargs)
self.routes.append(
routers.Route(url=r'^{prefix}/current{trailing_slash}',
mapping={'get': 'current'},
name='{basename}-current',
initkwargs={'suffix': 'Detail'}))
rest_router = CustomRouter()
urlpatterns = [
url(r'^', include(rest_router.urls)),
]
它可以工作,我可以通过/api/users/current/
访问我的登录用户
但是,如果我使用myCustomUser
并注册整个myUserViewSet
(它从ViewSet.ReadOnlyModelViewSet
派生而来):
我的当前/
路线停止工作。有没有一种方法可以添加这样一个不需要pk的定制细节路线
Edit:我的第二种方法是添加一个实际上只返回一个对象而不是一个对象的@list\u route
。这根本不需要自定义路由器,只需要在我的UserViewSet
上添加一个额外的方法:
rest_router.register(r'users', viewsets.UserViewSet)
class UserViewSet(viewsets.ReadOnlyModelViewSet):
…
@list_route(methods=['get'])
def current(self, request):
return Response(self.serializer_class(request.user).data)
然而,这很难看,原因很明显:为什么我要在列表路由中返回一个对象?根据定义,任何没有PK的路由都会成为列表路由。如果你从DefaultRouter的详细路由中删除“pk”部分,它将与列表路由相同。我知道这一点。问题是,我实际上需要一个详细的路由,但是有一个固定的PK(登录用户的ID)。但是如果我创建了一个
@detail\u route
,我必须将其称为api/users/current/1
,其中1可以是任何数字。但是您可以有多个用户,对吗?因此,pk实际上会有所不同。提供的pk是否真正对应于登录用户取决于您的权限类别。是的,但从请求的角度来看,它是固定的。因此,我不想把它放在URL中。