일반적으로 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배 이상 빨라졌다.