0
我所做的(工作)
ModelViewSet:DynamicListRoute使用自定義路由器 - Django的REST框架
class UserViewSet(viewsets.ModelViewSet):
"""
A viewset for viewing and editing user instances.
"""
permission_classes = [IsAuthenticated, IsUser]
serializer_class = UserSerializer
queryset = User.objects.all()
@list_route(methods=['GET','PUT'])
def me(self, request, *args, **kwargs):
self.kwargs.update(pk=request.user.id)
if request.method == 'GET':
return self.retrieve(request,*args, **kwargs)
else:
return self.update(request,*args, **kwargs)
注:
UserSerializer
是用戶一個簡單的ModelSerializer目的。IsUser
是一個允許類,驗證是否obj.id == request.user.id
SimpleRouter:
router = SimpleRouter(trailing_slash=False)
router.register(r'users', UserViewSet)
urlpatterns += router.urls
注:
- 的路徑不從這裏開始,但我會假設它是爲了命名端點。
所以,現在我已經得到了基本上所有的常規終點在SimpleRouter Documentation描述的路線,再加上:
- URL風格:
users/me
- HTTP方法:GET和PUT(如指定通過
methods
參數) - 行動:
me
(@list_route
飾法) - URL名稱:
user-me
我的要求
GET /users/me
返回JSON編碼用戶對象。PUT /users/me
更新用戶對象並返回更新的JSON編碼的用戶對象。
我想要什麼(不工作)
我不需要,不想要的,由SimpleRouter
創建的所有路由。
定製路由器
class CustomRetrieveUpdateRouter(SimpleRouter):
routes = [
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$',
mapping={'get': 'retrieve'},
name='{basename}-detail',
initkwargs={'suffix': 'Detail'}
),
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$',
mapping={'put': 'update'},
name='{basename}-detail',
initkwargs={'suffix': 'Detail'}
),
DynamicListRoute(
url=r'^{prefix}/{methodname}{trailing_slash}$',
name='{basename}-{methodnamehyphen}',
initkwargs={}
)
]
我的要求
GET /users/me
返回以下JSON體:{"detail":"Not found."}
和404
錯誤代碼。PUT /users/me
返回以下JSON正文:{"detail":"Method \"PUT\" not allowed."}
和405
錯誤代碼。
注:
在調試,如果我這樣做,返回404的請求,HTML頁面會顯示以下可用端點:
^users/(?P<pk>[^/.]+)$ [name='user-detail']
^users/(?P<pk>[^/.]+)$ [name='user-detail']
^users/me$ [name='user-me']
我忘了什麼?
你是什麼意思「我可以打電話../users/me」?你可以說得更詳細點嗎 ? – Linovia
當我對該端點執行GET請求時,會收到一個200響應,並帶有相應的JSON – NBajanca