annotate

riassuc·2021년 6월 13일

1차 프로젝트 클론코딩을 진행하면서 다른 테이블을 참조해서 그 값을 기준으로 정렬하고 싶었다. 그래서 모델링을 수정하여 새로운 컬럼을 추가하자니 그때만 쓸것이고, 직접적인 관련이 없는 데이터라서 컬럼을 추가하면 안된다고 생각했다. 그렇게 검색을 해보다가 annotate()를 찾게 되었는데 생각대로 작동하지 않았다. 여러 시행착오를 거쳐서 사용법을 조금 알 것 같다. 그 방법을 정리해보려고 한다.

annotate()


왼쪽부터 '제품', '별점'이라는 2개의 테이블이 있다.

제품.objects.order_by('가격')
이렇게 가격기준으로 정렬된 객체를 받을 수 있지만, 나는 제품 테이블의 품명 별로 별점의 평균값으로 정렬을 하고 싶었다.

원하던것 = 제품.objects.annotate(별점평균=Avg(별점__별점)).order_by('별점평균')
이렇게 한다면 '원하던것'이라는 객체는 내가 원하는 쿼리셋을 가지고 있다.

이걸 다시 그림으로 표현하자면

이런식으로 제품 테이블에 별점평균이라는 새로운 컬럼이 생긴것같은 객체를 가지고 있는것이다.

이 문제로 정말 오래 고민하고 찾고 나서도 이해가 안되서 많이 고생했는데 쓰고보니 조금 간단해 보이지만 여러모로 응용할 부분이 무궁무진한거 같다. 거진 이틀동안 고민했던 만큼 annotate()를 사용해서 원하는 로직을 구현했을때 기쁨도 컸다. 그리고 이번에 찾다가 느낀건데, orm으로 구현하고 싶은 것을 mysql로 어떻게 구현하는지를 먼저 찾고, 그 키워드로 orm으로 어떻게 구현하는지 검색을 해야겠다. 그게 더 찾기 쉽고 정확하게 찾을 수 있다.

profile
riassuc

0개의 댓글