📌 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 |