2015-12-24 2 views
1

В настоящее время у меня есть маршруты пользователей, использующие операции ModelViewSet для CRUD./users/self &/users/{id} route в Django Rest Framework

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

Однако, я хотел бы иметь конечные точки, похожие на пользователей Instagram: https://www.instagram.com/developer/endpoints/users/

  • /пользователей/{идентификатор пользователя}
  • /пользователи/самообеспечение

как имеющие то же CRUD ops, кроме одного - использовать request.user (при входе в систему).

Как бы я это сделал? Использование ModelViewSet и SimpleRouter?

Спасибо.

ответ

0

Его лучше использовать различные viewsets для

/users/{user-id} - PublicProfileViewset 
/users/self - MyProfileViewSet 

Причина в том, как Viewset имеет дело с различными разрешениями и разным QuerySet. Например, для доступа к PublicProfileViewset могут обращаться любые пользователи без входа в систему. Но MyprofileViewset должен быть доступен только зарегистрированным пользователем. Это похоже на общедоступный профиль и собственный профиль github.

Для PublicProfileViewset, вы можете использовать простой маршрутизатор. к сожалению, я не знаю, как к пользователю простые маршрутизаторы для MyProfileViewset, как здесь объект пользователя берется из request самого объекта, как request.user

views.py

class PublicUserProfileViewSet(viewsets.ReadOnlyModelViewSet): 
    """ 
    Public end-points to get information about any user 
    NOTE: All end-points provided here is read-only 
    """ 

    queryset = User.objects.public() 
    serializer_class = UserSerializer 
    permission_classes = (permissions.AllowAny,) 
    lookup_field = 'user_id' 
    lookup_url_kwarg = 'pk' 

class MyProfileViewSet(viewsets.ModelViewSet): 
    """ 
    End-points to get all details about logged in user 
    and update the profile of logged in user 
    """ 
    queryset = User.objects.all() 
    permission_classes = (permissions.IsAuthenticated,) 
    serializer_class = UserSerializer 

urls.py

router = routers.SimpleRouter() 
router.register(r'users', PublicProfileViewSet) 

urlpatterns = router.urls 

urlpatterns += [ 
    url(r'^users/me/$', MyProfileViewSet.as_view(
     {'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'delete'}), 
     name='myprofile'), 
] 

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

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