쿼리셋(QuerySet)

( 초보자가 공부하며 적은 글로 신뢰도가 떨어질 수 있습니다. 덧글로 틀린 부분 지적 및 추가 설명을 환영합니다. )

파이썬에 대한 기본적인 개념 정리를 마친 후 시작한 장고(Django)에 관한 공부에서 가장 헷갈렸던 것은 역시 다양한 용어들이었습니다. 쿼리셋, ORM, 정수(Int), 부동소수점(Float) 등 뼛속까지 프로그래밍 언어인 단어들부터 실생활이나 수학 시간에 사용했던 것들이지만, 프로그래밍에서 ‘이게 왜 필요하지?’라는 생각이 드는 단어들이 참 많았죠.

만들고 싶은 작품을 위해 파이썬을 시작했지만, 파이썬과 함께 미술 자료들을 전문적으로 정리할 사이트를 만들 계획으로 시작한 장고 공부에서 저를 가장 괴롭혔던 단어는 바로 이 ‘쿼리셋(QuerySet)’이라는 단어였습니다. 대충 듣자니 데이터베이스 용어 같기도 한 것이, 또 대충 예제대로 써보고 있자니 장고 용어 같기도 한 독특한 녀석이었죠. 통상적으로 설명되는 쿼리셋의 설명은 아래와 같은데요.


쿼리셋(QuerySet) : 데이터베이스에서 전달받은 모델의 객체 목록


그리고 저는 간단하게 아래처럼 머릿속에 넣어두고 있죠.

'Model_name.objects.all() 에서 ‘objects’가 쿼리셋이다.’

물론 이 ‘objects’ 또한 통상적으로는 'Model Manager, DB, Django Model 사이에서 질의 연산(Query Operation) 인터페이스 역할을 한다.' 라고 설명이 됩니다. 하지만, 저 같은 초보에게는 아직 빨아들이기 힘든 용어들이 많으니 일단 모두 불러오는 .all() 메소드와 함께 ‘Objects = 쿼리셋’이라 간단하게 머릿속에 입력해놓고 있는 것이죠.

여기서 .all()과 같은 objects 다음에 위치하는 함수들은 쿼리셋 메소드라고 부릅니다. 또 메소드의 괄호 안에 필터를 넣는 것으로 쿼리셋을 불러오며 다양한 방법으로 쿼리셋을 정렬시킬 수 있죠. 이 부분은 대충 제 머릿속에 이렇게 들어있습니다.

Model_name.objects.메소드(필터)

머릿속에 욱여넣고 실사용이 어떻게 되는지 간단하게 한 번 보시죠.

최근 작성해보고 있는 views.py의 일부입니다. 뷰 함수 articles를 보시면 'articles = Article.objects.all()’이 정의되어있는데요. 모델 Article에 정의된 모든 쿼리셋을 가져오겠다고 정의하는 것이죠. 게시글 전체를 나열하기 위한 방법으로 기본서에서 가장 많이 보이는 쿼리셋 이용법이기도 합니다.

다음은 그다음으로 가장 많이 등장하는 글 하나를 디테일하게 보여주는 방법인데요.

모델 Article 내부의 자료들을 가져오는 가장 기본적인 방법입니다. article_id는 모델 생성 시 자동으로 생성되는 id 필드를 이용하여 모델 객체의 고유 id와 함께 특정 객체를 불러오는 것인데요. 첫 번째 사진을 보면 models.py에 작성된 Article 모델 어디에도 id 필드는 생성되지 않은 것을 확인할 수 있습니다. 하지만, id 필드는 자동으로 생성되므로 두 번째 사진의 view.py에서 Article 모델이 가진 객체들의 id를 받아 사용하는 것을 볼 수 있습니다.

article_id를 이용하여 Article 모델의 한 객체를 불러와 사용하는 것을 아래 사진에서 확인할 수 있는데요.

article = Article.objects.get(id=article_id) 라고 정의하는 것으로 article에 하나의 고유 객체를 정의한 후 고유 객체에 저장된 필드들을 하나씩 불러오며 사용할 수 있습니다. article에 저장된 고유 객체의 content 필드를 가져오기 위해 article.content를 사용하게 되는 것이죠.

정말 이제 막 장고에 입문한 초보이던 시기에는 Article과 article처럼 가독성을 높이기 위해 모델과 뷰 함수 등에서 같은 이름이 대문자, 소문자로 구분되며 사용되는 부분이 상당히 헷갈리는 부분이었는데요. 지금은 가독성을 높이기 위한 것이라는 것을 파악하고 있지만, 당시는 '무조건 이렇게 작성해야 작동하는?'라는 의문에 빠져들기도 했었습니다.

a = Article.objects.get(id=article_id)
c = a.content

하지만, 이렇게 이름을 달리하고 사용하여도 전혀 문제가 없다는 것을 기본적인 코딩이 조금 능숙해져서는 작동이 되는지를 해볼 수 있을 때쯤 파악할 수 있었죠. 몇몇 분들은 '당연한 거 아니야?’라고 생각하실 수 있지만, (평생 문과로 살아왔던) 초보 중의 초보였던 저에게 이러한 정의들은 상당히 헷갈리는 사안이었습니다. 그나마 이제는 요정도는 가뿐하게 생각하고 사용할 수 있는 적당한 초보가 되었네요.

쿼리셋에 대한 글이니 갑작스럽게 정리를 해보자면, 이렇게 불러내어 정렬되는 객체들, 결과물이 모두 쿼리셋(QuerySet)이라는 것입니다. 네, 저도 어렵습니다...


반응형

댓글

개념미술가 : 이동준