[Django] 쿼리셋(QuerySet) 의 특징과 메소드 구현 방법

msung99·2023년 6월 18일
0
post-thumbnail

쿼리셋이란?

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에서 데이터를 검색하게 만들 수 있습니다.


쿼리셋의 메소드

이 정도로 간단히 쿼리셋의 개념을 정리해봤습니다. 지금부터 쿼리셋을 활용시 자주 활용되는 메소드와, 각각의 기능과 역할에 대해 정리해보겠습니다.

1. select

형태 : [클래스 명].objects.all()

해당 테이블 안에 있는 모든 데이터 조회합니다. QuerySet 타입으로 반환하게 됩니다.

In : Drink.objects.all()
Out: <QuerySet [<Drink: 나이트로 바닐라 크림>, <Drink: 나이트로 쇼콜라 클라우드>, <Drink: 망고 패션 후르츠 블렌디드>, <Drink: 딸기 요거트 블렌디드>, <Drink: 블랙 티 레모네이드>, <Drink: 쿨라임 피지오>, <Drink: 말차 초콜릿 라떼>, <Drink: 라임패션티>]>

2. get

형태 : [클래스 명].objects.get()

하나의 row만 조회합니다. 주로 pk컬럼으로 조회합니다. 결과가 1건 이상일 때는 에러를 발생시키며, QeuerySet 타입이 아닌 객체 타입으로 반환하게 됩니다.

In : Drink.objects.get(id=1)
Out: <Drink: 나이트로 바닐라 크림>

# pk컬럼명 대신 그냥 pk 키워드로도 조회 가능
In : Drink.objects.get(pk=1)  
Out: <Drink: 나이트로 바닐라 크림>

3. filter

형태 : [클래스 명].objects.filter()

특정 조건에 맞는 row만 조회하고 싶을 때 사용합니다. QuerySet 타입으로 반환하게 됩니다.

# category_id가 1인 데이터만 조회
In : Drink.objects.filter(category_id=1)
Out: <QuerySet [<Drink: 나이트로 바닐라 크림>, <Drink: 나이트로 쇼콜라 클라우드>]>

4. exclude

형태 : [클래스 명].objects.exclude()

특정 조건을 제외한 데이터만 조회하고 싶을 때 사용합니다. QuerySet 타입으로 반환하게 됩니다.

# category_id = 1인 데이터를 제외한 모든 데이터 조회
In : Drink.objects.exclude(category_id=1)
Out: <QuerySet [<Drink: 망고 패션 후르츠 블렌디드>, <Drink: 딸기 요거트 블렌디드>, <Drink: 블랙 티 레모네이드>, <Drink: 쿨라임 피지오>, <Drink: 말차 초콜릿 라떼>, <Drink: 라임패션티>]>

쿼리셋에 대한 나의 생각...!

쿼리셋은 매우 편리한 기능인 듯 합니다. 우선 편리성 측면에서 매우 좋다는 생각이 드네요! 쿼리셋을 사용하면 복잡한 SQL 쿼리를 직접 작성할 필요 없이, 파이썬의 체인 가능한 메소드를 사용하여 데이터베이스에서 원하는 데이터를 손쉽게 가져올 수 있는 것 같습니다.

또한 아직 정확히 이해는 못했지만, 체인 이 가능하다고 합니다. 여러 쿼리셋 메소드를 연결하여 사용할 수 있어서, 복잡한 쿼리를 단계별로 쉽게 구성할 수 있다니 매우 편리한 기능인 것 같네요!


참고

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글