[Django] Pagination과 offset, limit

2021. 9. 5. 23:21코딩일지/Django

Pagination에 대해서 어떻게 알게 되었는가?

1차 프로젝트를 진행하던 중 검색에 대한 결괏값을 나타내기 위한 리스트를 보여주는 로직을 구성하기 위해 찾게 되면서

데이터가 쌓이면서 페이지를 넘기는 것을 페이징이라는 것을 알게 됨.

 

Pagination과 offset,  limit 

 

※ Pagination(Paging) 기능

  •  백엔드에서 가지고 있는 데이터는 많고, 그 데이터를 한 화면에 전부 보여줄 수 없는 경우에 사용하게 됩니다.
  •  화면을 나눠서 지정한 일정 길이로 끊어서 전달하는 것을 페이징(페이지 네이션)이라고 한다.

 ex) 일반적인 게시판이나 상품 리스트들의 "이전 / 다음 페이지"를 끊어 보여주는 기능

 

 

search = request.GET.get('search', None)
page = request.GET.get('page', 1)

 

 request는 사용자가 보낸 총체적인 정보를 담고 있습니다.

(ex. 어디에서 어떠한 페이지로 정보를 보내는지)

GET은 request 방식 중 하나로써, GET 방식으로 정보를 받아오는 데이터를 가리키며, get 은 딕셔너리 자료형에서 key값으로 value를 찾을 때 사용됩니다.

이 말은 request.GET으로 받아온 값은 딕셔너리 자료형이라는 의미입니다.

여기서 search와 page에 해당되는 value를 가져오면 page의 번호를 리턴 받을 수 있습니다.

 또한, ('page', 1)의 1은 값을 넣지 않았을 때에도 1이라는 페이지부터 보여주게 됩니다.

 

products = Product.objects.prefetch_related('image_set'). filter(name__icontains = search)

 

 Product 클래스의 모든 객체 중  filter Method (__icontains) (필드명__icontains = 조건값을 통해 조건값이 포함되는 데이터 중 대소문자를 구분하지 않고 모두 가져옵니다)를 사용하여 필터링하여 Products 객체들을 불러옵니다.

 또한, prefetch_related('image_set') 역참조를 이용해 Product클래스를 foreignKey로 바라보는 Image클래스의 객체를 같이 불러오게 됩니다.

 

★ prefetch_related와 icontains에 대해 더 알고 싶으시면 아래의 링크를 클릭해주세요

(링크)

 

count = products.count()

 

 불러오는 객체의 총개수를 알게 하기 위하여 count Method를 사용합니다.

 

paginator = Paginator(products, 5)

 

 위에서 import 한 Paginator입니다.

2개의 인자를 받는데 첫 번째로 페이지로 분할될 객체, 두 번째로 한 페이지에 담길 객체의 수를 받습니다.

 

products = paginator.get_page(page)

 

 get_page 메서드는 페이지 번호를 받아 해당 페이지를 리턴하게 됩니다.

 그 후 이 페이지를 다시 render를 통해 넘겨주게 됩니다.

 

결괏값을 보여드리겠습니다.

 

http://127.0.0.1:8000/products?search=가정&page=1

 

page=1의 __icontains = '가정'이라는 이름으로 필터링된 상품들 중 paginator에 의해서 상품 5개를 보여주고 상품별 id와 이름, 가격, 역참조 된 이미지를 하나 출력해주고 있습니다.

카운트 개수로 보아 총 13개인 것을 알 수 있는데, 페이지 2번으로 옮기게 되면 

http://127.0.0.1:8000/products?search=가정&page=2

다음 page의 상품 5개를 불러오는 것을 볼 수 있습니다.

 

이처럼 한 페이지에 너무 많은 데이터를 보여줄 수 없기에  Paginator를 이용해 다양한 페이지를 사용해 데이터 값을 편리하게 보여줄 수 있다.

 

※ offset, limit

  • limit : 한 페이지에 보여줄 데이터 수
  • offset : 데이터가 시작하는 위치(index)

Paginator 말고도 offset과 limit를 이용해 페이지 네이션을 구현할 수 있다.

(추가예정)

'코딩일지 > Django' 카테고리의 다른 글

[Django] Kakao 소셜로그인 API  (0) 2021.10.03
[Django] Selected_related와 Prefetch_related  (0) 2021.09.11
[Djagno] Westagram 회원가입 기능 구현  (0) 2021.08.29
[Django] ManytoManyField  (0) 2021.08.26
[Django]C.R.U.D (3)  (0) 2021.08.26