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 (기존 업데이트)
장점
- 코드 간결성: 업데이트와 생성을 하나의 메소드로 처리하여 코드를 간결하게 유지할 수 있습니다.
- 성능: 트랜잭션 내에서 안전하게 동작하여 데이터의 일관성을 유지합니다.
- 유지보수 용이성: 명확한 로직 흐름으로 코드의 가독성을 높이고 유지보수를 쉽게 합니다.
'Django > orm' 카테고리의 다른 글
count() 관련 성능 비교 (0) | 2024.07.22 |
---|---|
Dynamdb() Scan vs query (0) | 2024.02.06 |
DynamoDB() (0) | 2024.02.05 |
Django date range (0) | 2024.02.01 |
F() (0) | 2024.01.24 |