[Django] GET API 분석, ListAPIView

서재환·2022년 10월 19일
0

Django

목록 보기
32/40

Filter 관련 API 분석


class PartsRequestListView(generics.ListAPIView):
    """
    요청 관리(어드민)

    ---
    """

    queryset = PartsRequest.objects.all().order_by("-id")
    serializer_class = PartsRequestListSerializer
    permission_classes = [permissions.IsAuthenticated, AdminPermission]
    filter_backends = (drf_filters.DjangoFilterBackend,)
    filterset_class = PartsRequestListFilter
    pagination_class = CustomPageNumberPagination

    @swagger_auto_schema(
        pagination_class=CustomPageNumberPagination,
        paginator_inspectors=[PageNumberPaginatorInspector],
    )
    def get(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        pages = self.paginate_queryset(queryset)

        parts_request_manager = PartsRequestManage()

        for page in pages:
            total_price = parts_request_manager.add_retail_price(page)
            page.total_price = total_price

        serializer = self.get_serializer(pages, many=True)

        return self.get_paginated_response(serializer.data)

permission_classes

  • 인증 인가 관련해서 선언한 클래스 중 적용시키고 싶은 클래스를 기입해준다.

filter_backends

  • 장고에서 제공하는 여러 필터 중 해당 class에 적용시키고 싶을 경우 filter_backends field에 장고에서 제공하는 필터를 기입한다.

  • REST 프레임워크에 대해 고도의 custom이 가능한 필드 필터링을 지원하는 DjangoFilterBackend 클래스를 기입하였다.

filterset_class

  • 사용자가 정의한 필터 관련 클래스를 입력하는 란이다. 프론트에서 해당 인자에 값을 넣으면 값을 넣은 parameter 부문만 활성화 되고 해당 부분이 아래 코드에서 적용된다.

    queryset = self.filter_queryset(self.get_queryset())

pagination_class

  • 사용자가 paginatioin과 관련해서 정의한 객체를 해당 변수 안에 담는다.

swagger_auto_schema

해당 부문을 기입해주면 swagger responses 부문에서 아래와 같은 결과 값을 얻을 수 있다.

pagination_class=CustomPageNumberPagination
paginator_inspectors = [PageNumberPaginatorInspector]

해석

  • filter_backends = (drf_filters.DjangoFilterBackend,)
    해당 클래스에 한해서 장고의 어떤 필터를 쓸지 설정한다.

  • filterset_class = PartsRequestListFilter
    적용할 필터를 설정한다.

  • queryset = self.filter_queryset(self.get_queryset())
    적용 할 필터를 적용한다.

  • pages = self.paginate_queryset(queryset)
    한 페이지에 보여 줄 데이터의 총 양을 뽑아낸다.

  • for page in pages: ...
    for문을 돌면서 보여줄 데이터 하나하나에 총 청구 금액을 담아준다.

  • serializer = self.get_serializer(pages, many=True)
    청구액을 적용한 한페이지에 보여 줄 데이터를 serializer화 해주고 모든 필드를 표시해준다.

  • self.get_paginated_response(serializer.data)
    serializer 내부의 데이터를 paginated style화 해서 반환해준다.

참고자료

paginator_inspectors

0개의 댓글