QuerySet 이란 데이터베이스에서 전달 받은 객체의 목록입니다. 리스트와 구조는 같지만 파이썬 기본 자료구조가 아니기 때문에, 파이썬에서 읽고 쓰기 위해 자료형 변환(Casting)
을 해줘야한다.
다시 정리하자면, 쿼리셋(QuerySet)은 전달받은 모델의 객체 목록으로, 쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있습니다. 쿼리셋은 데이터베이스의 여러 레코드(row)를 나타냅니다.
from .models import Book
Book.objects.all() # Book 모델(테이블)의 모든 데이터를 갖고와라!
<QuerySet [<Book: 책 제목1>, <Book: 책 제목2>]>
여기서 objects 는 Model Manager 입니다. DB와 Django Model 사이의 Query Operation(질의연산)의 인터페이스 역할을 합니다. 이 때, objects 를 사용해서 다수의 데이터를 갖고오는 함수를 사용할 때, 반환되는 객체가 QuerySet 입니다,
이 Manager 각 모델(클래스)가 최소 하나씩 갖고 있습니다. Person.objects 의 의미는, objects라는 이름의 manager가 Person 데이터베이스를 QuerySet 형태로 만들겠다는 의미입니다. 그 QuerySet에서 데이터를 검색하게 만들 수 있습니다.
이 정도로 간단히 쿼리셋의 개념을 정리해봤습니다. 지금부터 쿼리셋을 활용시 자주 활용되는 메소드와, 각각의 기능과 역할에 대해 정리해보겠습니다.
형태 : [클래스 명].objects.all()
해당 테이블 안에 있는 모든 데이터 조회합니다. QuerySet 타입으로 반환하게 됩니다.
In : Drink.objects.all()
Out: <QuerySet [<Drink: 나이트로 바닐라 크림>, <Drink: 나이트로 쇼콜라 클라우드>, <Drink: 망고 패션 후르츠 블렌디드>, <Drink: 딸기 요거트 블렌디드>, <Drink: 블랙 티 레모네이드>, <Drink: 쿨라임 피지오>, <Drink: 말차 초콜릿 라떼>, <Drink: 라임패션티>]>
형태 : [클래스 명].objects.get()
하나의 row만 조회합니다. 주로 pk컬럼으로 조회합니다. 결과가 1건 이상일 때는 에러를 발생시키며, QeuerySet 타입이 아닌 객체 타입으로 반환하게 됩니다.
In : Drink.objects.get(id=1)
Out: <Drink: 나이트로 바닐라 크림>
# pk컬럼명 대신 그냥 pk 키워드로도 조회 가능
In : Drink.objects.get(pk=1)
Out: <Drink: 나이트로 바닐라 크림>
형태 : [클래스 명].objects.filter()
특정 조건에 맞는 row만 조회하고 싶을 때 사용합니다. QuerySet 타입으로 반환하게 됩니다.
# category_id가 1인 데이터만 조회
In : Drink.objects.filter(category_id=1)
Out: <QuerySet [<Drink: 나이트로 바닐라 크림>, <Drink: 나이트로 쇼콜라 클라우드>]>
형태 : [클래스 명].objects.exclude()
특정 조건을 제외한 데이터만 조회하고 싶을 때 사용합니다. QuerySet 타입으로 반환하게 됩니다.
# category_id = 1인 데이터를 제외한 모든 데이터 조회
In : Drink.objects.exclude(category_id=1)
Out: <QuerySet [<Drink: 망고 패션 후르츠 블렌디드>, <Drink: 딸기 요거트 블렌디드>, <Drink: 블랙 티 레모네이드>, <Drink: 쿨라임 피지오>, <Drink: 말차 초콜릿 라떼>, <Drink: 라임패션티>]>
쿼리셋은 매우 편리한 기능인 듯 합니다. 우선 편리성
측면에서 매우 좋다는 생각이 드네요! 쿼리셋을 사용하면 복잡한 SQL 쿼리를 직접 작성할 필요 없이, 파이썬의 체인 가능한 메소드를 사용하여 데이터베이스에서 원하는 데이터를 손쉽게 가져올 수 있는 것 같습니다.
또한 아직 정확히 이해는 못했지만, 체인
이 가능하다고 합니다. 여러 쿼리셋 메소드를 연결하여 사용할 수 있어서, 복잡한 쿼리를 단계별로 쉽게 구성할 수 있다니 매우 편리한 기능인 것 같네요!