我目前有两个不同的基于类的视图,用于详细说明特定对象和列出所有对象:
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时它会返回相应的对象,而当它没有时,它应该返回整个对象列表。
谢谢你的帮助 :)
使用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
好的,所以我在Gahan和Daniel 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
非常感谢你们!