TIL no.40 bulk_create

백선호·2021년 8월 13일
0

TIL

목록 보기
38/39
post-thumbnail

일반적으로 object를 생성할 때 쓰는 create() 메서드는 한 번 실행될 때 하나 query를 거쳐 하나의 object를 생성하게 된다. 그런데 만약 많은 개수의 objects를 생성할 때 bulk_create() 메서드를 사용하면 좀 더 효과적이다. 기능상의 문제는 없지만 특히 속도 상의 이점이 있다.

class OrderView(View):
    @login
    @transaction.atomic
    def post(self, request):
        item_id = request.GET.get("item_id", None)
        data    = json.loads(request.body)      
                
        if Order.objects.filter(member_id = request.user.id, status_id = OrderStatus.Status.WAITING.value).exists():
            Order.objects.filter(member_id = request.user.id, status_id = OrderStatus.Status.WAITING.value).delete()

        order = Order.objects.create(member_id = request.user.id, status_id = OrderStatus.Status.WAITING.value, location_id = None)
        
        OrderItem.objects.bulk_create(
            [OrderItem
            (item_id             = cart.item_id if not item_id else item_id, 
            order_id             = order.id,  
            quantity             = cart.quantity if not item_id else data['quantity'],
            order_item_status_id = OrderItemStatus.ItemStatus.WAITING.value,
            ) for cart in (Cart.objects.filter(member_id = request.user.id) if not item_id else range(1))]
        )
        return JsonResponse({'MESSAGE': "SUCCESS"}, status=201)

프로젝트 진행 중 결제 전 상태의 테이블을 만들어 주는 함수에 bulk_create를 사용하였다. 장바구니에 담기는 상품의 개수가 많을 경우 일반적이 쿼리를 사용하여 create를 한 것보다 속도상 10배 이상 빨라졌다.

profile
baik9261@gmail.com

0개의 댓글