본문 바로가기
FrameWork/Django

Pagination

by mansoorrr 2024. 7. 21.

django는 기본적으로 pagenation을 제공한다. 그래서 다른 프레임워크에 비해 페이지네이션을 쉽게 구현 가능하다.

 

[** pagination **]

  • 1개의 room에는 여러개의 review가 달릴 수 있음
  • 이것을 모두 조회하게 되면 1000개, 10000개의 리뷰가 한꺼번에 조회 될 것임
  • 이것은 db에 많은 부하를 줌
  • 페이지네이션을 적용해 db부하를 줄이고 효율적으로 데이터를 볼 수 있도록 함
  • django는 request시 url의 parameter를 알 수 있도록 query_params메서드를 제공
#---------- rooms/views.py
class RoomReviews(APIView):
     def get_object(self, room_pk):
          try:
               room = Room.objects.get(pk=room_pk)
          except Room.DoesNotExist:
               raise ParseError(f"room_pk={room_pk} is not exist")
          return room

     def get(self, request, room_pk):
          try:
               #url에서 page정보 받아오기, page정보가 없을경우 page지정
               page = request.query_params.get('page', 1)
               page = int(page)
          except ValueError:
               #page정보가 이상한게 들어왔을 경우
               page = 1 #초기화
          page_size = 3 #페이지 사이즈 설정
          review_start_num = (page-1)*page_size
          review_end_num = page*page_size
          room = self.get_object(room_pk)
          reviews = room.reviews.all()[review_start_num:review_end_num] #슬라이싱
          serializer = ReviewSerializer(reviews, many=True)
          return Response(serializer.data)

'FrameWork > Django' 카테고리의 다른 글

Permission Classes  (0) 2024.07.22
File Upload  (0) 2024.07.21
DB transaction  (0) 2024.07.20
DRF Serializer  (0) 2024.07.18
DRF APIView  (0) 2024.07.18