Что я сделал (рабочий)
ModelViewSet:DynamicListRoute с пользовательским роутером - Джанго Rest Framework
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
Обновление объекта User и возврат обновленного JSON-кодированного объекта User.
То, что я хочу (не работает)
мне не нужно, и не хочу, все маршруты, созданных 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
Код ошибки.
Примечание:
В Debug, если я делаю запрос, который возвращает 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