对List和Retrieve Rest API使用一个基于类的视图

时间:2017-12-17 10:27:28

标签: python django django-rest-framework

我目前有两个不同的基于类的视图,用于详细说明特定对象和列出所有对象:

class StatusList(ListAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = serializers.StatusSerializer

    def get_queryset(self):
        queryset = helperfunctions.getObjects(self.request.user, models.Status)
        return queryset


class StatusDetail(RetrieveAPIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = serializers.StatusSerializer

    def get_queryset(self):
        queryset = helperfunctions.getObjects(self.request.user, models.Status)
        return queryset

请注意,helperfunctions.getObjects()只返回与用户共享同一机构的对象,这样他们就无法看到他们不应该查看的状态。

我想知道的是,是否有一个选项只能为StatusDetail和StatusList使用一个基于类的视图,它会自动知道当它在get请求中获得pk时它会返回相应的对象,当它没有时,它应该返回整个对象列表。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

使用viewsets,就像这样 :

from rest_framework import viewsets, permissions, mixins    
class StatusDetail(mixins.ListModelMixin, #specify wanted mixins
                       mixins.RetrieveModelMixin,
                       viewsets.GenericViewSet): 
    permission_classes = (IsAuthenticated,)
    serializer_class = serializers.StatusSerializer

    def get_queryset(self):
        queryset = helperfunctions.getObjects(self.request.user, models.Status)
        return queryset

答案 1 :(得分:1)

好的,所以我在GahanDaniel Roseman的评论的帮助下得到了这个非常棒的,干净的解决方案:

class StatusViewSet(ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = serializers.StatusSerializer

def get_queryset(self):
    queryset = helperfunctions.getObjects(self.request.user, models.Status)
    return queryset

并在urlpatterns中添加了一个路由器:

router = routers.SimpleRouter()
router.register(r'status', views.StatusViewSet, base_name='Status')

urlpatterns = router.urls

非常感谢你们!