Python/Django

Django ORM 기본 쿼리셋 사용법 (filter(), get(), all() 등)

임베디드 친구 2025. 11. 1. 19:39
반응형

Django ORM 기본 쿼리셋 사용법 (filter(), get(), all() 등)

Django에서는 강력한 ORM(Object-Relational Mapping) 기능을 제공하여 SQL을 직접 작성하지 않고도 데이터베이스에서 데이터를 조회하고 조작할 수 있습니다. 이번 포스팅에서는 Django ORM의 기본적인 쿼리셋 사용법을 다루겠습니다.

1. Django ORM과 쿼리셋(QuerySet) 개요

Django의 ORM은 Python 객체를 통해 데이터베이스와 상호작용할 수 있도록 도와줍니다. 이 ORM을 통해 SQL을 직접 작성하지 않고도 데이터를 조회, 삽입, 수정, 삭제할 수 있습니다.

쿼리셋(QuerySet)이란 데이터베이스에서 특정 조건을 만족하는 객체 목록을 나타내는 Django의 데이터베이스 추상화 개념입니다. QuerySet을 사용하면 데이터를 필터링하고 정렬하는 등 다양한 연산을 수행할 수 있습니다.

2. 기본적인 쿼리셋 메서드

2.1 all(): 모든 객체 가져오기

모든 레코드를 조회할 때는 all() 메서드를 사용합니다.

from myapp.models import Product

# Product 테이블의 모든 데이터를 가져오기
products = Product.objects.all()

for product in products:
    print(product.name, product.price)

이 메서드는 데이터베이스의 전체 데이터를 가져오므로 대량의 데이터를 다룰 때는 주의해야 합니다.

2.2 filter(): 특정 조건에 맞는 객체 조회

특정 조건을 만족하는 데이터만 가져오고 싶을 때 filter()를 사용합니다.

# 가격이 10000원 이상인 제품 가져오기
expensive_products = Product.objects.filter(price__gte=10000)

for product in expensive_products:
    print(product.name, product.price)

filter()는 여러 개의 객체를 반환할 수 있으며, SQL의 WHERE 절과 같은 역할을 합니다.

2.2.1 여러 조건을 적용하기

# 가격이 10000원 이상이고, 카테고리가 '전자제품'인 상품 조회
products = Product.objects.filter(price__gte=10000, category='전자제품')

filter() 안에 여러 개의 조건을 전달하면 AND 조건이 적용됩니다.

2.2.2 OR 조건 사용하기

OR 조건을 적용하려면 Q 객체를 사용해야 합니다.

from django.db.models import Q

# 가격이 10000원 이상이거나 카테고리가 '전자제품'인 상품 조회
products = Product.objects.filter(Q(price__gte=10000) | Q(category='전자제품'))

2.3 get(): 단일 객체 조회

get() 메서드는 특정 조건을 만족하는 단 하나의 객체를 조회할 때 사용됩니다.

# ID가 1인 상품 가져오기
product = Product.objects.get(id=1)
print(product.name, product.price)

단, get() 메서드는 결과가 2개 이상이거나 없을 경우 오류를 발생시키므로 반드시 단일 객체가 반환된다는 것을 확신할 때만 사용해야 합니다.

# 오류 발생 예시
product = Product.objects.get(price__gte=10000)  # 조건을 만족하는 제품이 여러 개라면 오류 발생

2.4 exclude(): 특정 조건을 제외한 객체 조회

exclude() 메서드는 특정 조건을 제외하고 데이터를 조회할 때 사용됩니다.

# 카테고리가 '전자제품'이 아닌 상품 조회
non_electronics = Product.objects.exclude(category='전자제품')

2.5 order_by(): 정렬하기

order_by()를 사용하면 데이터를 정렬할 수 있습니다.

# 가격 오름차순 정렬
products = Product.objects.order_by('price')

# 가격 내림차순 정렬
products_desc = Product.objects.order_by('-price')

여러 개의 정렬 조건을 적용할 수도 있습니다.

# 가격 오름차순, 이름 오름차순 정렬
products = Product.objects.order_by('price', 'name')

2.6 values(): 특정 필드만 가져오기

values() 메서드를 사용하면 특정 필드만 가져올 수 있습니다.

# 상품 이름과 가격만 가져오기
products = Product.objects.values('name', 'price')

for product in products:
    print(product['name'], product['price'])

2.7 count(): 개수 세기

데이터의 개수를 세고 싶을 때 count() 메서드를 사용합니다.

# 전체 상품 개수
product_count = Product.objects.count()

# 10000원 이상의 상품 개수
expensive_product_count = Product.objects.filter(price__gte=10000).count()

2.8 exists(): 존재 여부 확인

특정 조건을 만족하는 객체가 존재하는지 확인할 때는 exists()를 사용합니다.

# 특정 카테고리의 상품이 존재하는지 확인
has_electronics = Product.objects.filter(category='전자제품').exists()

3. 결론

Django ORM의 기본적인 쿼리셋 사용법을 살펴보았습니다. all(), filter(), get(), exclude(), order_by() 등의 다양한 메서드를 활용하여 데이터를 조회할 수 있으며, count()exists() 같은 메서드를 이용해 데이터를 효과적으로 관리할 수 있습니다.

Django ORM을 잘 활용하면 SQL을 직접 작성하지 않고도 데이터를 다룰 수 있어 생산성을 높일 수 있습니다.

반응형