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)
- 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)