update_or_create(defaults=None, **kwargs)
필요한 경우 새로운 object를 생성
한다.default
는 field와 value의 쌍으로 이루어진 dictionary
로 object를 업데이트할 때 사용
된다.(object, created)
의 튜플을 리턴한다. object
는 생성 혹은 업데이트된 object이다.created
는 불리언 값으로 새로운 값이 생성되었는지(생성되었다면 True) 표시해준다.keyword arguments를 기반
으로 데이터베이스에서 객체를 가져온다.default 딕셔너리에서 전달된 값
으로 field를 업데이트한다.defaults = {'first_name': 'Bob'}
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
for key, value in defaults.items():
setattr(obj, key, value)
obj.save()
except Person.DoesNotExist:
new_values = {'first_name': 'John', 'last_name': 'Lennon'}
new_values.update(defaults)
obj = Person(**new_values)
obj.save()
defaults
딕셔너리에 들어있는 first_name으로 기존에 있던 데이터의 first_name을 변경하는 코드이다.
즉, try가 작동된다면
John Lennon은 Bob Lennon으로 변경된다.
except의 코드가 작동된다면
데이터베이스에는 John Lennon이라는 사람이 없으므로 업데이트된 값인 Bob Lennon이라는 데이터가 새롭게 데이터베이스에 생성되게 된다.
위의 패턴은 모델의 필드의 수가 증가함에 따라 다루기 어려워진다.
위의 코드는 아래의 코드로 다시 쓰여질 수 있다.
obj, created = Person.objects.update_or_create(
first_name='John', last_name='Lennon',
defaults={'first_name': 'Bob'},
)