📌 Django ORM - get_or_create 완전 정복

2025. 5. 16. 13:20·기술블로그-Django편

📌 Django ORM - get_or_create 완전 정복


✅ 개념 설명

get_or_create()는 Django ORM에서 가장 자주 쓰이는 메서드 중 하나로,
**"해당 조건의 객체가 있으면 가져오고, 없으면 새로 생성"**하는 기능을 제공합니다.

obj, created = Model.objects.get_or_create(조건)

반환값 설명

obj 가져오거나 새로 만든 객체
created 새로 생성되었으면 True, 기존에 있던 것이면 False

🧪 기본 사용 예시

user, created = User.objects.get_or_create(email='test@example.com')
  • 해당 이메일을 가진 유저가 있으면 user에 할당
  • 없으면 새로 생성 후 저장하고, created=True

🔍 필드값 추가하여 생성하기

user, created = User.objects.get_or_create(
    email='test@example.com',
    defaults={'nickname': '테스트유저', 'is_active': True}
)
  • defaults는 생성될 경우에만 적용되는 필드값입니다.
  • 이미 있는 경우에는 defaults 값은 무시됩니다.

⚠️ 주의사항

1️⃣ unique 제약 조건 필수

  • get_or_create는 조건을 기반으로 동작하기 때문에,
    모델 필드에 unique=True 또는 unique_together가 있는 것이 안전합니다.

2️⃣ 동시성 문제

  • 트랜잭션이 적용되지 않으면 동시 요청 시 중복 생성 가능성 존재
  • 실무에서는 transaction.atomic() 블록으로 감싸는 것이 좋습니다.
from django.db import transaction

with transaction.atomic():
    obj, created = Model.objects.get_or_create(...)

💡 활용 사례

📌 회원 가입 시 이메일 중복 검사 및 자동 생성

user, created = User.objects.get_or_create(email=email_input)
if created:
    print("새 유저 생성 완료")
else:
    print("기존 유저 로그인")

📌 좋아요, 팔로우 기능 등 중복 방지 로직

like, created = Like.objects.get_or_create(
    user=request.user,
    post=post_instance
)
  • 이미 좋아요를 눌렀다면 아무 작업도 하지 않고 가져옴
  • 처음 누르는 경우에만 생성됨

🧠 요약

항목 설명

목적 중복 없이 객체 생성 or 조회
리턴값 (객체, created) 튜플
defaults 객체 생성 시에만 적용될 추가 필드값
created True면 새로 생성된 것, False면 기존 객체
실무 팁 트랜잭션 처리, unique 필드로 안정성 확보

get_or_create()는 짧고 강력한 명령이지만, 사용 시 주의할 점도 많습니다.
데이터 무결성과 성능을 고려한 안전한 사용이 중요합니다 ✅

'기술블로그-Django편' 카테고리의 다른 글

✅ Django symmetrical 옵션 완전 이해하기  (0) 2025.05.16
✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기  (0) 2025.05.16
📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명  (0) 2025.05.16
📌 Django에서의 팔로우 기능 모델링 완전 정복  (0) 2025.05.16
🧠 Django에서 name=name 의미 완전 정리하기  (0) 2025.05.15
'기술블로그-Django편' 카테고리의 다른 글
  • ✅ Django symmetrical 옵션 완전 이해하기
  • ✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기
  • 📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명
  • 📌 Django에서의 팔로우 기능 모델링 완전 정복
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (717) N
      • Python (32)
      • 프로젝트 (55) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41) N
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 Django ORM - get_or_create 완전 정복
상단으로

티스토리툴바