save()
메서드를 사용하기 전까진 데이터베이스와의 호출이 이뤄지지 않기 때문에, +=
으로 실행한 update 쿼리문 내용이 데이터베이스에 반영되지 않는다.
역참조 혹은 참조 중인 테이블의 데이터를 업데이트할 때에는 save()
메서드를 업데이트 쿼리문에서 사용하는 객체에 적용해야 한다. 이해하기 어려우니 아래의 코드를 참고하자.
cart.order.save()
에서 확인할 수 있듯이, save()
를 order
객체에 사용하지않고, cart.order
객체에 사용했다. 겉보기엔 order
와 cart.order
가 같은 object를 가리키지만, 엄밀히 말해 동일한 값은 아니다.(print(order is cart.order)
는 false
가 나온다) 그렇기 때문에 여러 개의 변수가 사용되는 혼란을 막기 위해서라도, 업데이트 쿼리문 cart.order.total_quantity += quantity
에서 사용 중인 객체 cart.order
에 save()
를 적용해야, 데이터베이스에 수정된 값을 정확히 반영할 수 있다.
with transaction.atomic():
order, order_is_created = Order.objects.get_or_create(
user_id=user.id, order_status_id=1
)
cart, cart_is_created = Cart.objects.get_or_create(
order=order, product=product
)
if not cart_is_created:
cart.quantity += quantity
cart.order.total_quantity += quantity
cart.order.total_price += cart.product.price * quantity
else:
if order_is_created:
cart.quantity = quantity
cart.order.total_quantity = quantity
cart.order.total_price = cart.product.price * quantity
cart.order.shipping_method = shipping_method
cart.order.shipping_price = 3300
else:
cart.quantity = quantity
cart.order.total_quantity += quantity
cart.order.total_price += cart.product.price * quantity
cart.order.save() # 이 곳을 order.save()로 입력하면, DB 데이터가 제대로 업데이트되지 않는 문제가 생길 수 있다.
cart.save()
save()
가 필요없는 django 메서드objects.create()
delete()
update()