안녕하세요. Django를 이용해 현재 웹 개발을 하고 있는데, 인터넷을 아무리 뒤져도 에

 
SeungHwan Joo

안녕하세요. Django를 이용해 현재 웹 개발을 하고 있는데, 인터넷을 아무리 뒤져도 에러의 명확한 원인을 찾지 못해 이렇게 처음으로 질문을 올리게 되었습니다.

현재 모델의 DateField에 저장된 날짜를 기준으로 order_by함수로 정렬한 후, pagination하고 있습니다. 하지만 결과를 확인해보니 페이지마다 중복된 객체가 몇개씩 출력되었습니다. (예를 들어 1페이지에 나왔던 객체가 2페이지에도 등장)
전체 출력된 객체의 갯수는 예상한 대로 나와서 얼핏 보면 paginaion이 잘 된 줄 알았지만, 결과를 자세히 확인해보면 몇 개의 객체들이 중복되었고, 중복된 갯수만큼의 객체들이 출력되지 않았습니다.

아래의 stackoverflow를 참고하여

http://stackoverflow.com/questions/5044464/django-pagination-is-repeating-results
http://stackoverflow.com/questions/31736700/duplicate-elements-in-django-paginate-after-order-by-call

원인: queryset에서 같은 날짜를 가진 객체들이 존재했기 때문
해결법: unique한 필드(예를 들어, id나 created_at)를 order_by 함수 인자에 추가

이 정도까지 알아냈지만, 왜 queryset에서 같은 날짜를 가진 객체들이 존재하면 이런 현상이 발생하는건지에 대한 근본적인 원인을 아시는 분 계신가요??

참고로 queryset에 order_by함수를 적용했을 때 정상적으로 출력됨을 확인하였고, order_by 함수를 적용하지 않고 그냥 pagination했을 때는 중복이 발생하지 않음을 확인하였습니다. order_by, pagination를 동시에 적용했을 때만 위의 현상이 발생하였습니다.

  • Seulki Kim

    Kyeong-Mook Kay Cha 도와주세요!!

    박영록

    원래 데이터베이스에서 order by를 한 필드의 값이 같은 row들이 어떤 순서로 나올지가 deterministic하지 않습니다. 같은 쿼리를 날려도 같은 order by 값을 가지는 row들의 순서는 뒤바뀔 수 있다는 거죠.

    Peelsup Jung

    order_by에 유니크 필드를 하나 더 추가해 보면 확실해 지겠네요.

Advertisements