Используйте одно представление на основе классов для API List и Retrieve Rest

В настоящее время у меня есть два различных представления на основе классов для детализации определенного объекта и для перечисления всех объектов:

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, который будет автоматически знать, что когда он получает pk в запросе get, он возвращает соответствующий объект, а когда нет, он должен вернуть весь список объектов.

Спасибо за любую помощь:)

3 ответа

Решение

Используйте 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

Viewsets имеет ReadOnlyModelViewSetпозволит только retrieveа также list.

      class StatusDetail(viewsets.ReadOnlyModelViewSet): 
    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

Спасибо всем большое!

Другие вопросы по тегам