ListSerializer 커스텀으로 bulk_create/update 구현
DRF의 ListSerializer를 커스터마이징하여 여러 객체를 한 번의 쿼리로 생성하거나 수정하는 방법. 기본 ListSerializer는 각 객체마다 개별 쿼리를 실행하여 N+1 문제를 발생시키지만, 커스텀 구현으로 성능을 획기적으로 개선 가능
bulk_create 구현
커스텀 ListSerializer 생성
serializers.ListSerializer를 상속받아create메서드 오버라이드validated_data를 모델 객체 리스트로 변환:[Product(**item) for item in validated_data]Product.objects.bulk_create(products)로 한 번에 생성transaction.atomic()으로 원자성 보장
Serializer에 적용
Meta클래스에list_serializer_class = CustomListSerializer설정View에서
many=True옵션으로 사용
bulk_update 구현
커스텀 ListSerializer 생성
update메서드 오버라이드하여instance와validated_data처리validated_data를 id 기준으로 딕셔너리 매핑:{item['id']: item for item in validated_data}각 객체의 필드를
setattr(obj, field, value)로 업데이트Product.objects.bulk_update(objects_to_update, fields=['name', 'price'])로 실행
주의사항
update용 Serializer에서
id필드를read_only_fields에서 제외fields매개변수에 업데이트할 필드 목록 명시 필요
실무 주의사항
제약사항
save()메서드가 호출되지 않아 오버라이드된 로직 미실행pre_save,post_save시그널 미발생시그널 의존 로직은 별도 서비스 함수로 분리하여 직접 호출
데이터베이스 고려사항
일부 구버전 DB에서 PK 반환 미지원 가능
ignore_conflicts=True옵션으로 UNIQUE 제약 조건 위반 처리 가능 (PostgreSQL만 지원)
Last updated
