• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

페이징 처리 매개변수와 페이징처리과정 의문

23.04.25 05:45 작성 23.04.25 06:09 수정 조회수 388

0

Q1, Q2, Q3 이 있는데 Q1은 해결한것 같습니다(?)

 


Q1

강의 슬라이드에서

필기 해주실때

paginate_by=10 넘겨줄때 page=3 이라고 하셨는데

paginate_by = ~개씩 보기

page = 몇 페이지에서의 (현재 보는 페이지)

라는 의미라면

page 라는 이름의 매개변수까지 전달해주면 혹시 어디로 전달되나요? page라는 값은 쿼리할때도 응답받으로때도 계속 코드에서 기억하고 있어야 할 것 같은데 안보이고있네요..ㅎㅎ

살펴보고있는데 page라는 변수는 클래스변수에도 없고 위 그림의 paginate_queryset 메서드의 인자로도 없고 그래서요 (물론 리턴값으로는 나오지만..)

자문자답

아 paginate_queryset 메서드 상단에 있었네요.

(그전 DetailView에서 pk, slug 식별자가 디폴트였던것처럼) page 매개변수도 page_kwargs 클래스변수로 있고 그 값을 룩업 해서 self.kwargs 라는 딕셔너리 클래스변수에서 먼저 뒤지고

없다면 아예 HttpRequest 객체에서 뒤지고

그래도 없다면 1(첫페이지) 로 하드코딩해서 초기화 하네요

 


Q2

그리고 pagination_queryset 메서드의 page_size 매개변수는 어떤 의미 인가요? 보니깐 get_paginate_by(self, queryset) 로 그냥 단순 paginate_by (몇개씩 볼껀지) 클래스변수를 그대로 getter 해오고 page_size 라는 get_context_data메서드 내 지역변수로 쓰고 버리던데...? 궁금합니다

자문자답

-> 조회한 전체 qs 수 군요~

 


Q3

get_paginate_by 메서드에 왜 QuerySet 객체가 있을까요? 분명히 이렇게 설계한 이유가 있을꺼 같은데?

왜냐면 get_context_data 메서드 안에서

get_paginate_by(queryset: QuerySet) 호출한번하는데

사실상 API는 get_paginate_by 메서드는 단순하게 클래스변수인 self.paginate_by 를 리턴해주고 있어서 여쭤봅니다.

 

 

답변 2

·

답변을 작성해보세요.

1

page_size 는 한 페이지에서 보여줄 개수입니다.
page_size 값의 유무로 페이징 처리 여부를 판단하구요.
paginate_queryset 메서드에서는 page_size를 Paginator 생성 시에 사용하고 있습니다.

소스코드를 읽기만 하기보다, 디버거를 물려서 한 step 씩 break point를 이동하며, 각 값들의 변화를 예상해보시고 확인하시는 과정을 수행해보시는 것을 추천드립니다. 막연히 상상만 하는 코드 리딩보다 이해도가 훨씬 좋아집니다.

get_paginate_by 메서드에서 queryset 인자를 왜 받는 지는 정확히는 저도 잘 모르겠습니다.
막연히 상상해보자면 ...
get_paginate_by 메서드를 구현한다는 것은 동적으로 page size를 결정할 목적일테니
queryset.count() 를 통해 Rows 개수가 너무 적을 경우에는 페이징 처리를 하지 않도록 해볼 수도 있을 듯 합니다.

화이팅입니다. :-)

디버거를 물려서 한 step 씩 break point를 이동하며, 각 값들의 변화를 예상해보시고 확인하시는 과정을 수행해보시는 것을 추천드립니다. 막연히 상상만 하는 코드 리딩보다 이해도가 훨씬 좋아집니다.

이런식으로 디버깅 이용해서도 명확하게 해봐야겠네요. 감사합니다!

0

감사합니다.!

저희가 주입해주는 get_paginate_by 클래스변수와 API 메서드 내 page_size 지역변수 둘다 한페이지내 보여줄 객체 갯수를 의미한다.

그리고

get_paginate_by 메서드는 뭔가 오버라이딩 해서 개발할때 필요한 인자일수도있어서 만든사람이 넣어놓거 같기도 한거 같았습니다.