django rest framework에서 bulk create 기능을 api로 제공하기

코딩하는범이·2021년 1월 13일
1
post-thumbnail

오늘은 rest framework를 통해서 json 형태로 되어있는 많은 양의 데이터를 한번에 저장 시켜 보려고 한다. 많은 양의 데이터를 저장해야하는데 for문 돌려서 매번 post 메서드를 호출한다면 매우 비효율 적이고 우아하지 못하다.

일단 코드는 저번에 썼던 django rest framework에서 rest api 구현하기의 코드에서 이어 써보도록 하겠다.

json 형태는 아래와 같이 들어온다고 가정을 하고 코드를 짜보겠다.

{
     "data": [
 {
    "code": "1",
    "name": "삼성전자",
    "price":"90000"
},
{
    "code": "2",
    "name": "LG화학",
    "price":"800000"
},
{
    "code": "3",
    "name": "현대자동차",
    "price":"200000"
}
]
}

필자는 rest framework가 제공해주는 create를 viewset에서 override(재정의) 해서 사용을 했다.

viewset.py

from rest_framework.response import Response
from rest_framework import viewsets, status

from util import setEnvironment
from . import models, serializers


class StockViewset(viewsets.ModelViewSet):
    queryset = models.Stock.objects.all()
    serializer_class = serializers.StockSerializer

    def create(self, request, *args, **kwargs):
        stock_data = request.data.get("data")
        serializer = self.get_serializer(data=stock_data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        print(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

create 메서드에서 request로 들어온 데이터를 자신의 입맛에 맞게 파싱해주면 된다. 그리고 나서 serializer에 many=True 속성을 꼭 붙여줘야한다! many 속성은 여러 항목이 포함되어있다는 뜻이다. 이 속성을 붙여주지 않으면 queryset이 단일 인스턴스이고 serializer.data가 단일 객체가 됨을 뜻하므로... 꼭 붙여야한다.
그리고 perform_create에서는 명시적으로 serializer.save() 를 불러주고있다.

그리고 필자가 실수해서 애를 먹었던 부분인데... Response의 import를 rest_framework에서 불러온게 아닌 requests에서 불러왔었다. 자동 임포트를 사용할때에도 혼동하지 말고 잘 import 하도록 하자 ㅠㅠ

그리고 postman을 통해서 body에 json을 넣어 전송하면 아래와 같이 잘 전송된걸 볼 수있다.

끗!

profile
기록 그리고 기억

0개의 댓글