🔍 Django ORM: get() vs filter() 차이점 완벽 정리

2025. 5. 14. 14:25·기술블로그-Django편

🔍 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
'기술블로그-Django편' 카테고리의 다른 글
  • 💻 Django 프로젝트 세팅 완전 정복!
  • 🔍 Django ORM Field Lookups 완벽 정리
  • 🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법
  • 🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (800) N
      • Python (32)
      • 프로젝트 (115) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    americanlaw
    gpterror
    btsjungkook
    urbantrends
    americaparty
    livebroadcast
    bts
    chinanightlife
    trumpmuskclash
    remittance
    basalcellcarcinoma
    self-growth
    btsdischarge
    btscomeback
    뷔
    classaction
    college reunions
    newpoliticalparty
    youngprofessionals
    btsreunion
    titaniumcase
    travel ban
    RM
    global politics
    homebartrend
    life reflection
    smartphonedurability
    hotcoffeecase
    lawsuitculture
    chatgpterror
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🔍 Django ORM: get() vs filter() 차이점 완벽 정리
상단으로

티스토리툴바