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)
장고에서 제공하는 여러 필터 중 해당 class에 적용시키고 싶을 경우 filter_backends
field에 장고에서 제공하는 필터를 기입한다.
REST 프레임워크에 대해 고도의 custom이 가능한 필드 필터링을 지원하는 DjangoFilterBackend
클래스를 기입하였다.
queryset = self.filter_queryset(self.get_queryset())
paginatioin
과 관련해서 정의한 객체를 해당 변수 안에 담는다.해당 부문을 기입해주면 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화 해서 반환해준다.