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 |