django order by 를 사용해 봅시다.

웹/장고 2022. 8. 23. 02:00

 안녕하세요. 이번 시간에는 django order_by에 대해 알아보겠습니다. foreign key와 annotate와 섞어서 써야 하는 예제는 다음에 보도록 하고요. 간단한 예제 위주로 굴려보겠습니다.

 


 먼저 post에는 아래와 같은 데이터가 들어 있어요. 작성자 user는 User 테이블을 참조하는 foreign key입니다. 먼저, post 사전순으로 올려봅시다. 알파벳 소문자와 공백으로만 이루어져 있고, 아스키 사전순으로 정렬되게끔 세팅했다고 하겠습니다.

 

 

 그러면 order_by에 "post"를 적어주면 됩니다. 저는 Post에서 "post"의 내용을 기준으로 사전순 오름차순으로 정렬할 것이기 때문입니다. asc입니다.

 

 그러면, 4개의 포스트가 사전순으로 정렬됨을 볼 수 있어요. 반대로 내림차순은 어떨까요? 앞에 -를 붙이면 됩니다. 그러면 desc 정렬이 됩니다.

 

 

 "-post"는 post 내림차순으로 정렬합니다. 포스트는 varchar로 되어 있을 테니, 설정된 정렬 기준 내림차순으로 돌리겠네요.

 

 그러면 아까와는 다르게 "hi", "bye bye", ... 순으로 출력됨을 볼 수 있어요. 여기까지 정리하면 -를 안 붙이면 오름차순, -를 붙이면 내림차순으로 sorting 합니다.

 


 이제, 작성자까지 정렬 기준에 넣어봅시다. 작성자는 장고의 auth.models의 User를 사용합니다. 이 User를 foreign key로 잡고 있어요.

 

 이제, admin 이라는 이름을 가진 작성자가 "bye bye" 라는 포스트를 추가했어요. 자. 이제 post는 사전 내림차순으로, 만약에 포스트의 내용이 같다면, 작성자 이름 오름차순으로 정렬해 봅시다. 어떻게 하면 될까요? 1차 정렬 기준은 post 내림차순이므로 "-post"를 앞에 적어주면 됩니다. 같으면 2차 정렬 기준이 수행되는데요. user의 username이므로 "user__username"으로 적어줍니다. 즉, 앞에 적어준 기준 우선, 뒤에 적어준 기준은 상대적으로 우선 순위가 밀립니다.

 

 

 코드로 보면 19번째 줄입니다. order_by의 1번째 인자에 "-post"가, 2번째 인자에 "user__username"이 들어가 있어요. 그러면, 1번째 기준으로 post 내림차순으로, 2번째 기준으로 user의 유저 이름 오름차순으로 정렬한다는 의미입니다.

 

 예상했던 대로 잘 돌아가네요. 그런데, 문서에서 order_by를 보면, 인자에 *fields 라고 되어 있어요. fields가 아닌 *가 있는데요. 뭘 의미할까요? 이 연산자. 패킹과 언패킹 할 때 나온 것입니다. 아래 코드를 봅시다.

 

 20번째 줄에 *ordering이라고 보이실 겁니다. 리스트 안에 객체들이 있는데요. 이를 *ordering 이라는 걸 통해서 풀어줘요. 그래서 실제로 order_by에 넘어가는 것은 "-post", "user__username" 이렇게 2개의 인자가 넘어가게 되는 것입니다. query parameter에 따라서 여러 가지 sort 옵션이 있을 때 지저분 해지기 쉬운데요. 딕셔너리와 저 특성을 잘 이용하면 생각보다 깔끔하게 처리할 수 있습니다.