[django] paging

송민준·2023년 5월 29일
0

출그니 (캡스톤)

목록 보기
5/6

페이징이 필요한 이유는 모든 피드를 가져오는데 걸리는 시간은 유저가 피드를 작성할 수록 오래걸리기 때문입니다.

페이징을 통해 페이지의 피드 개수와 페이지 인덱스를 정하면 고정된 피드 개수만을 가져와서 응답시간이 느려지는 문제를 해결할 수 있습니다.

다음은 여러 유저를 쿼리하는 view 입니다.

View

class UserInfoView(generics.ListAPIView):
    serializer_class = UserSerializer
    def get_queryset(self):
				...
        page_index = int(self.request.query_params.get('page_index', 0))
        page_num = int(self.request.query_params.get('page_num', 4))

        offset = page_num * page_index
        limit = offset + page_num
        queryset = User.objects.all().order_by("user_nickname")
        if user_email is not None:
            queryset = queryset.filter(user_email__startswith=user_email)[offset:limit]
            return queryset
        if user_nickname is not None:
            queryset = queryset.filter(user_nickname__startswith=user_nickname)[offset:limit]
            return queryset
        if user_id is not None:
            queryset = queryset.filter(id=user_id)[offset:limit]
            return queryset
        return User.objects.none()
  • page_index: 페이지의 인덱스입니다. 구글 검색할 때 1 페이지 같은 인덱스입니다.

  • page_num: 페이지 하나에 들어갈 피드의 개수입니다.

  • offset: 데이터베이스의 어느 인덱스부터 가져올 지에 대한 변수입니다.

  • limit: 어느 인덱스까지 가져올 지에 대한 변수입니다.

  • queryset.filter(user_email__startswith=user_email)[offset:limit]: 리스트 슬라이싱을 통해 쿼리를 offset부터 limit까지의 인덱스로 가져옵니다.

profile
개발자

0개의 댓글