/用户/自我及/Django Rest框架中的用户/{id}路由

/用户/自我及/Django Rest框架中的用户/{id}路由,django,django-rest-framework,restful-url,Django,Django Rest Framework,Restful Url,我目前有用户使用ModelViewSet执行CRUD操作 class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer 但是,我希望拥有与Instagram用户类似的端点: /用户/{user id} /用户/自身 两者都有相同的CRUD ops,除了一个是使用request.user(如果已登录) 我该怎么做呢?使用Mode

我目前有用户使用ModelViewSet执行CRUD操作

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
但是,我希望拥有与Instagram用户类似的端点:

  • /用户/{user id}
  • /用户/自身
两者都有相同的CRUD ops,除了一个是使用request.user(如果已登录)

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


谢谢。

最好使用不同的视图集

/users/{user-id} - PublicProfileViewset
/users/self - MyProfileViewSet
原因是viewset处理不同的权限和不同的查询集。例如,任何人无需登录即可访问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
url.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'),
]

最好使用不同的视图集

/users/{user-id} - PublicProfileViewset
/users/self - MyProfileViewSet
原因是viewset处理不同的权限和不同的查询集。例如,任何人无需登录即可访问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
url.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'),
]