update_or_create란
이름 그대로 특정 객체를 업데이트하거나 없으면 새로 생성하는 ORM 메서드이다. 주로 중복 방지와 간결한 코드 작성을 위해 사용된다.
사용법
Model.objects.update_or_create(defaults=None, **kwargs)
kwargs: 객체를 검색하는 데 사용하는 조건
defaults: 객체를 업데이트하거나 새로 생성할 때 사용할 기본 값
예제
from django.contrib.auth.models import User
user, created = User.objects.update_or_create(
username="johndoe",
defaults={"email": "johndoe@example.com", "is_active": True}
)
if created:
print("새 사용자가 생성되었습니다.")
else:
print("기존 사용자가 업데이트되었습니다.")
)
- username="johndoe" 조건으로 객체 검색
- 객체가 있으면 email과 is_active 필드 업데이트
- 객체가 없으면 username="johndoe", "email": "johndoe@example.com", "is_active": True로 새 객체 생성
리턴값
- 객체 (obj): 업데이트되거나 새로 생성된 모델 객체.
- created (bool): 객체가 생성되었는지 여부 (True이면 생성, False이면 업데이트).
주의할 점
- update_or_create는 atomic 트랜잭션을 사용한다. 따라서 다중 스레드 환경에서 안전하게 사용할 수 있다. 하지만, 고도로 동시성이 높은 환경에서 여전히 race condition이 발생할 수 있으므로 조심해야 한다.
- defaults에 지정되지 않은 필드는 업데이트되지 않고, 기존 값을 유지한다.
- 객체를 먼저 검색한 후 업데이트/생성을 수행하므로 데이터베이스에 추가적인 부하가 있을 수 있다.
- kwargs로 전달한 필드는 모델에서 unique 해야 한다.