[Django/DRF] 한 번에 create하기; bulk_create의 기본

조오닭·2024년 4월 4일
1

별 건 아니지만 생각보다 자료가 없어 남기는 글이다.

bulk_createviews.py에서 Model을 한번에 직접 create 하는 메소드라고 생각하면 편하다.
예를들어,

# in models.py
class Name(models.Model):
	name = models.CharField(max_length=100, null=False)
    
# in views.py
class NameSaveView(APIView):
	def post(self, request, *args, **kwargs):
    	names = request.data.get("names").split(",")
        for name in names:
        	Name.objects.create(name=name)
            #### OR ####
            # Name(name=name).save()
        return Response({"message": "created"}, status=status.HTTP_201_CREATED)

이 상황에서 쿼리를 조회하면, 다음과 같을 것이다.

INSERT INTO "Name" ("name") VALUES ("name1");
INSERT INTO "Name" ("name") VALUES ("name2");
INSERT INTO "Name" ("name") VALUES ("name3");
INSERT INTO "Name" ("name") VALUES ("name4");
...

매우 불편한 반복된 쿼리문인데, 아래와 같이 bulk_create() 를 사용하면 쿼리문도 깔끔해지고 코드도 단축된다.

# in views.py
class NameSaveView(APIView):
	def post(self, request, *args, **kwargs):
    	names = request.data.get("names").split(",")
		Name.objects.bulk_create([Name(name=name) for name in names])

쿼리는 다음과 같이 조회된다.

INSERT INTO "Name" ("name") VALUES ("name1"), ("name2"), ("name3"), ("name4"), ...

매우 갈금.

하지만 유효성 검증에 있어 가끔 트러블이 날 때도 있다고 하니, 다른 테이블들이 해당 테이블에 영향을 받지 않을 때 사용하는 것이 좋다고 한다. (참고: https://gardeny.tistory.com/15)

profile
백엔드 응애

0개의 댓글

관련 채용 정보