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을 직접 작성하지 않고도 데이터를 다룰 수 있어 생산성을 높일 수 있습니다.
'Python > Django' 카테고리의 다른 글
| Django Form 기본 개념 및 활용법 (forms.py) (0) | 2025.11.03 |
|---|---|
| Django Admin 사이트 설정 및 커스터마이징 (admin.py) (0) | 2025.11.02 |
| Django 모델(Model) 정의 및 마이그레이션 이해하기 (0) | 2025.10.31 |
| Django에서 데이터베이스 설정하기 (settings.py에서 DATABASES 설정) (0) | 2025.10.30 |
| Django ORM(Object-Relational Mapping) 개념 및 사용법 (0) | 2025.10.29 |