get_or_create는 무엇일까 ?
get_or_create(defaults=None, **kwargs)
주어진 객체 kwargs(모델에 모든 필드에 대한 기본값이 있는 경우 비어 있을 수 있음)를 사용하여 객체를 검색하고 필요한 경우 생성하는 편리한 방법입니다.
(object, created)의 '튜플'을 반환합니다. 여기서 개체는 검색되거나 생성된 개체이고 생성된 개체는 새 개체 생성 여부를 지정하는 부울입니다.
출처 : https://docs.djangoproject.com/en/4.0/ref/models/querysets/
get_or_create는 해당 조건의 값으로 생성된 데이터가 있다면 그 데이터를 get해주고, 없다면 생성해주는 메소드이다. 사용 예시를 보면서 이해해보자.
get_or_create 적용시켜보기
if not cart_object.exists():
Cart.objects.create(user_id = user.id, product_option_id = product_option_id)
cart_object.update(quantity = data['quantity'])
return JsonResponse({"message" : "CREATE_CART_SUCCESS"}, status=201)
else:
cart_object.update(quantity = data['quantity'])
return JsonResponse({"message" : "UPDATE_CART_SUCCESS"}, status=201)
cart라는 테이블에 조건의 user_id와 product_option_id가 일치하는 데이터가 존재할 경우와 아닌경우를 나누는 exists 조건문을 작성해보았다.
하지만 get_or_create메소드를 사용한다면, 이렇게 불필요한 if문을 사용할 필요가 없다.
cart, created = Cart.objects.get_or_create(
user_id = user.id,
product_option_id = product_option_id.id,
defaults={'quantity': data['quantity']}
)
if not created:
cart.quantity = data['quantity']
cart.save()
같은 결과를 반환하지만, 메소드를 사용하여 훨씬 가독성도 높고 간결한 코드를 작성할 수 있었다.