update_or_create는 장고에서 제공하는 메서드로 get_or_create와 비슷하게 작동한다.
객체가 이미 존재하는 경우 update 하고 없는 경우 create하는 것이다.
get_or_create와 마찬가지로 (object, created) 튜플을 반환한다.
object는 update되거나 create되는 객체이고 created는 boolean으로 객체가 create되면 True, 이미 있다면 False로 반환된다.
경쟁조건을 피하기 위해 get_or_create와 마찬가지로 defaults 파라미터를 활용할 수 있다.
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()
# 위 코드와 같은 결과가 나오는 update_or_create
obj, created = Person.objects.update_or_create(
first_name='John', last_name='Lennon',
defaults={'first_name': 'Bob'},
)
출처: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#update-or-create