2015-12-24 32 views
1

我目前拥有使用ModelViewSet进行CRUD操作的用户路由。/users/self&/ users/{id} route in Django Rest Framework

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

不过,我想有类似Instagram的用户端点:https://www.instagram.com/developer/endpoints/users/

  • /用户/ {用户ID}
  • /用户/自

均具有相同的CRUD操作,除了一个是使用request.user(如果登录)。

我该怎么做呢?使用ModelViewSet和SimpleRouter?

谢谢。

回答

0

其更好地使用不同的viewsets为

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

的原因是不同的权限和不同的查询集两个视图集中交易。例如,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'), 
]