🔍 Django ORM: get() vs filter() 차이점 완벽 정리
✅ 목적
Django에서 DB에서 데이터를 조회할 때 사용하는 두 가지 주요 방법:
- get()
- filter()
이 둘은 겉보기엔 비슷하지만, 내부 동작과 예외 처리, 반환값이 전혀 다릅니다.
🔎 1. get() 메서드
ShortURL.objects.get(id=1)
항목 설명
반환값 | 단일 객체 (ShortURL 인스턴스) |
조건 만족 객체 수 | 정확히 1개여야 함 |
없을 때 | DoesNotExist 예외 발생 ❗ |
여러 개일 때 | MultipleObjectsReturned 예외 발생 ❗ |
✅ 사용 예
try:
url = ShortURL.objects.get(id=1)
print(url) # __str__() 결과 출력
except ShortURL.DoesNotExist:
print("존재하지 않음")
🔎 2. filter() 메서드
ShortURL.objects.filter(id=1)
항목 설명
반환값 | QuerySet (리스트 비슷한 객체) |
조건 만족 객체 수 | 0개 이상 가능 (0, 1, N) |
없을 때 | 빈 QuerySet 반환 ([]) ✅ |
여러 개일 때 | 모두 리스트로 반환 ✅ |
✅ 사용 예
urls = ShortURL.objects.filter(id=1)
for url in urls:
print(url)
🧠 핵심 비교 요약
항목 get() filter()
결과 | 단일 객체 | QuerySet (목록형) |
조건 미충족 시 | 예외 발생 | 빈 리스트 |
여러 개일 경우 | 예외 발생 | 여러 개 반환 |
일반적 용도 | PK 조회, 유일조건 | 다건 조회, 검색 |
📝 실무 팁
- get()은 정확히 하나만 나올 것이 보장되는 상황에서만 사용하세요.
- 다수 가능성 있다면 filter()로 조회한 뒤 .first(), .last(), .exists() 등과 조합하세요.
- 예외 처리 없는 filter().first()는 깔끔한 코드 흐름을 만들 수 있습니다.
✅ 예시: 존재 여부 확인
if ShortURL.objects.filter(code="abc123").exists():
print("존재합니다")
else:
print("존재하지 않습니다")
✅ 추가 사용법: .filter().first()
short_url = ShortURL.objects.filter(id=100).first()
상황 | 결과 |
조건에 맞는 객체 있음 | 해당 객체 1개 반환 |
조건 불일치 | None 반환 ✅ |
- .first()는 QuerySet에서 첫 번째 객체만 반환
- 존재하지 않으면 예외 없이 None 반환 → get()보다 안전
✅ 예시 비교
# 안전한 방식 (존재 여부 모를 때)
short_url = ShortURL.objects.filter(id=100).first()
if short_url:
print(short_url)
else:
print("존재하지 않음")
🧠 핵심 비교 요약
항목 | get() | filter() |
결과 | 단일 객체 | QuerySet (목록형) |
조건 미충족 시 | 예외 발생 | 빈 리스트 |
여러 개일 경우 | 예외 발생 | 여러 개 반환 |
일반적 용도 | PK 조회, 유일조건 | 다건 조회, 검색 |
📝 실무 팁
- get()은 정확히 하나만 나올 것이 보장되는 상황에서만 사용하세요.
- 다수 가능성 있다면 filter()로 조회한 뒤 .first(), .last(), .exists() 등과 조합하세요.
- 예외 처리 없는 filter().first()는 깔끔한 코드 흐름을 만들 수 있습니다.
✅ 예시: 존재 여부 확인
if ShortURL.objects.filter(code="abc123").exists():
print("존재합니다")
else:
print("존재하지 않습니다")
✅ 결론
- get()은 정밀 저격 🔫
- filter()는 넓게 훑기 🔍
- filter().first()는 안전한 한 발 🎯
'기술블로그-Django편' 카테고리의 다른 글
💻 Django 프로젝트 세팅 완전 정복! (0) | 2025.05.14 |
---|---|
🔍 Django ORM Field Lookups 완벽 정리 (0) | 2025.05.14 |
🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법 (0) | 2025.05.14 |
🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교 (0) | 2025.05.14 |
[Django 3일차] Django에서의 요청(request)과 뷰(view)의 모든 것 1/4 (short_url 프로젝트)(250514) (0) | 2025.05.14 |