2017-01-31 4 views
0

Что я сделал (рабочий)

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']

Что я забываю?

+0

Что вы подразумеваете под «Я могу позвонить ../users/me»? Можете быть более конкретными ? – Linovia

+0

Когда я делаю запрос GET к этой конечной точке, я получаю ответ 200 с соответствующим JSON – NBajanca

ответ

1

Похоже, что у вас есть конфликт в ваших маршрутах.

^users/(?P<pk>[^/.]+)$ должен поймать «/ users/me», и поэтому у него не будет возможности попасть в ваш конкретный вид.

Либо установите pk url kwargs regexp на нечто более конкретное (например, целые числа для id) или установите DynamicListRoute перед двумя другими Route.

 Смежные вопросы

  • Нет связанных вопросов^_^