Django REST Framework: `IntegrityError: NOT NULL constraint failed` 해결 및 Serializer `read_only_fields` 활용
🤖 AI 추천
Django REST Framework를 사용하여 API를 개발하며 데이터 무결성 제약 조건 오류를 경험했거나, 계산된 필드를 처리하는 방법을 배우고 싶은 백엔드 개발자에게 유용한 콘텐츠입니다.
🔖 주요 키워드
핵심 기술
이 글은 Django REST Framework(DRF)를 사용하여 이커머스 API를 개발하는 과정에서 발생한 IntegrityError: NOT NULL constraint failed: orders_order.total_amount
오류를 해결하는 과정을 다룹니다. 핵심은 클라이언트로부터 제공되지 않는 계산된 필드(total_amount
)에 대한 DRF Serializer의 read_only_fields
설정과 create
메소드에서의 기본값 처리입니다.
기술적 세부사항
- 문제 발생: Order 생성 API 테스트 중
total_amount
필드가 NULL이라NOT NULL
제약 조건에 실패하는 오류 발생. - 원인 분석: Unit test는 통과했지만 API 호출 시 오류가 발생한 것으로 보아, 모델 자체보다는 DRF Serializer가 클라이언트로부터
total_amount
를 받지 못해 발생한 문제로 판단. - 해결 방안 1 (Serializer
read_only_fields
):order_date
,total_amount
,status
,price_at_order
와 같이 백엔드에서 계산되거나 생성되는 필드들을OrderSerializer
의Meta
클래스에서read_only_fields
로 지정하여 클라이언트 입력에서 제외.OrderItemSerializer
예시:
python class OrderItemSerializer(serializers.ModelSerializer): class Meta: model = OrderItem fields = ['id', 'product', 'product_id', 'quantity', 'price_at_order'] read_only_fields = ['price_at_order']
OrderSerializer
예시:
python class OrderSerializer(serializers.ModelSerializer): class Meta: model = Order fields = ['id', 'customer', 'order_date', 'total_amount', 'status', 'items'] read_only_fields = ['order_date', 'total_amount', 'status']
- 해결 방안 2 (Serializer
create
메소드):read_only_fields
로 지정했음에도total_amount
는 DB 제약 조건으로 인해 반드시 값이 필요하므로, Serializer의create
메소드에서Order.objects.create(**validated_data)
호출 시total_amount=0.00
과 같이 명시적으로 기본값을 전달. - 테스트:
Product
및Customer
모델에 대한 단위 테스트는 성공적으로 수행되었으며,auto_now
필드 테스트를 위해time.sleep
사용.
개발 임팩트
- 데이터 무결성 제약 조건을 준수하면서 계산된 필드를 API에서 올바르게 처리할 수 있게 됩니다.
- DRF Serializer의
read_only_fields
활용법을 이해하여 API 디자인을 개선할 수 있습니다. - 클라이언트의 불필요한 데이터 전송을 줄이고 백엔드의 역할에 집중할 수 있습니다.
커뮤니티 반응
톤앤매너
개발자가 겪을 수 있는 구체적인 문제 상황과 해결 과정을 명확하게 제시하며 전문적인 톤을 유지합니다.
📚 관련 자료
django-rest-framework
Django REST Framework의 공식 저장소로, 본문에서 다루는 모든 API 개발 및 Serializer 관련 기능의 기반이 되는 라이브러리입니다.
관련도: 99%
cookiecutter-django
Django 프로젝트의 기반을 설정하는 데 사용되는 프로젝트 템플릿으로, DRF를 포함한 일반적인 Django 프로젝트 구조 및 설정에 대한 인사이트를 제공하여 본문의 프로젝트 설정과 유사한 컨텍스트를 이해하는 데 도움이 됩니다.
관련도: 70%
django
Django 프레임워크의 공식 저장소로, ORM, 모델 정의, 데이터베이스 연동 등 본문에서 언급된 `IntegrityError`와 같은 DB 관련 오류의 근본 원인이 되는 Django의 핵심 기능을 이해하는 데 필수적입니다.
관련도: 85%