django - update - save()

김영훈·2021년 7월 26일
0

Django

목록 보기
10/11

django에서 업데이트 쿼리 사용 시 주의사항

  • save() 메서드를 사용하기 전까진 데이터베이스와의 호출이 이뤄지지 않기 때문에, +=으로 실행한 update 쿼리문 내용이 데이터베이스에 반영되지 않는다.

  • 역참조 혹은 참조 중인 테이블의 데이터를 업데이트할 때에는 save() 메서드를 업데이트 쿼리문에서 사용하는 객체에 적용해야 한다. 이해하기 어려우니 아래의 코드를 참고하자.

  • cart.order.save()에서 확인할 수 있듯이, save()order 객체에 사용하지않고, cart.order 객체에 사용했다. 겉보기엔 ordercart.order가 같은 object를 가리키지만, 엄밀히 말해 동일한 값은 아니다.(print(order is cart.order)false가 나온다) 그렇기 때문에 여러 개의 변수가 사용되는 혼란을 막기 위해서라도, 업데이트 쿼리문 cart.order.total_quantity += quantity에서 사용 중인 객체 cart.ordersave()를 적용해야, 데이터베이스에 수정된 값을 정확히 반영할 수 있다.

                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()
profile
Difference & Repetition

0개의 댓글