Django/orm

update_or_create

두잇 두두 2024. 6. 28. 09:38
728x90

update_or_create

Django orm을 다루며 객체가 있으면 객체로 불러와서 사용하고 없으면 create를 해서 사용하려고 하는데 create 시 필수 값을 넣어줘야 했습니다. 그래서 if 문을 통해 분기를 하면 코드가 길어져 가독성이 떨어졌습니다.

그래서 다른 방법이 있나 찾다가 update_or_create를 발견했습니다.

 

Django의 update_or_create 메소드는 객체를 업데이트하거나 존재하지 않으면 생성하는 작업을 간편하게 처리할 수 있는 메소드입니다.

update_or_create(defaults=None, **kwargs)

 

  • defaults: 객체를 생성하거나 업데이트할 때 사용될 필드와 값을 포함하는 사전(dict).
  • **kwargs: 객체를 조회할 때 사용할 필터 조건을 키워드 인자로 받습니다.

예제 코드

from myapp.models import TravelRecommendationRegion

region_dict = {
    'name': 'Europe',
    'icon_image_url': 'https://example.com/europe.png',
    'priority': 1,
    'deeplink_url': 'https://example.com/europe'
}

# update_or_create 메소드 호출
trr, created = TravelRecommendationRegion.objects.update_or_create(
    name=region_dict['name'],
    defaults={
        'icon_image_url': region_dict['icon_image_url'],
        'priority': region_dict['priority'],
        'deeplink_url': region_dict.get('deeplink_url', None),
    }
)

# 결과 출력
print(f"Name: {trr.name}")
print(f"Icon Image URL: {trr.icon_image_url}")
print(f"Priority: {trr.priority}")
print(f"Deeplink URL: {trr.deeplink_url}")
print(f"Created: {created}")  # True (새로 생성된 경우), False (기존 업데이트)

 

장점

  • 코드 간결성: 업데이트와 생성을 하나의 메소드로 처리하여 코드를 간결하게 유지할 수 있습니다.
  • 성능: 트랜잭션 내에서 안전하게 동작하여 데이터의 일관성을 유지합니다.
  • 유지보수 용이성: 명확한 로직 흐름으로 코드의 가독성을 높이고 유지보수를 쉽게 합니다.