[django] update_or_create

nikevapormax·2022년 10월 24일
0

TIL

목록 보기
102/116
post-custom-banner

update_or_create

공식문서

djangoproject - update_or_create

기본형태

update_or_create(defaults=None, **kwargs)

설명

  • 주어진 keyword arguments를 사용해 object를 업데이트할 수 있는 편리한 방법이며, 필요한 경우 새로운 object를 생성한다.
  • default는 field와 value의 쌍으로 이루어진 dictionaryobject를 업데이트할 때 사용된다.
  • 결과값으로 (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'},
)
  • 설명 파트에서 언급한 것과 같이, obj와 created를 print해보면 각 객체와 객체가 생성되었는지(created=True) 또는 업데이트되었는지(created=False)를 알 수 있다.
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글