TIL 18. Pagination

박경철·2021년 6월 27일
0

TIL

목록 보기
18/19

1. Pagination

1.1 Paginator 함수를 사용하여 Pagination기능 구현

class ReviewView(View):
    def get(self, request):
        product_id = request.GET.get('product_id',None)
        page       = request.GET.get('page',None)
        page_size  = request.GET.get('page_size',None)
        reviews    = Review.objects.filter(product_id=product_id).prefetch_related('user', 'reviewimage_set')
        paginator  = Paginator(reviews, page_size)

        result = [{
                'user'         : review.user.name,
                'contents'     : review.contents,
                'score'        : review.score,
                'manager_text' : review.manager_text,
                'create_at'    : review.create_at,
                'update_at'    : review.update_at,
                'images'       : [data.image for data in review.reviewimage_set.all()]
                } for review in paginator.page(page if paginator.num_pages > int(page) else paginator.num_pages)]

        return JsonResponse({'reviews':result}, status=200)

1.2 offset, limit를 사용하여 Pagination 기능 구현

  • offet과 limit을 사용하면 특정 인덱스 범위의 데이터만 접근하기 때문에 메모리 효율에도 좋음
  • page에 대한 Error가 발생하지 않음(ex page = 100 인데 데이터가 없을 경우 empty list으로 반환 되기 때문에)
  • offset과 limit을 페이지에 의존되는게 아닌 Front-end에서 요청에 따라 유동적으로 데이터를 보내기 위해 Query Parameter을 사용
class ReviewView(View):
    def get(self, request):
        product_id = request.GET.get('product_id')
        page       = request.GET.get('page',1)
        page_size  = request.GET.get('page_size',3)

        limit  = int(page) * int(page_size) 
        offset = int(limit) - int(page_size)

        reviews = Review.objects.filter(product_id=product_id).prefetch_related('user','reviewimage_set')[offset:limit]

        result = [{
                'user'         : review.user.name,
                'contents'     : review.contents,
                'score'        : review.score,
                'manager_text' : review.manager_text,
                'create_at'    : review.create_at,
                'update_at'    : review.update_at,
                'images'       : [data.image for data in review.reviewimage_set.all()]
                } for review in reviews]

        return JsonResponse({'reviews':result}, status=200)
profile
안녕하세요!

0개의 댓글