Django REST Framework: `IntegrityError: NOT NULL constraint failed` 해결 및 Serializer `read_only_fields` 활용

🤖 AI 추천

Django REST Framework를 사용하여 API를 개발하며 데이터 무결성 제약 조건 오류를 경험했거나, 계산된 필드를 처리하는 방법을 배우고 싶은 백엔드 개발자에게 유용한 콘텐츠입니다.

🔖 주요 키워드

Django REST Framework: `IntegrityError: NOT NULL constraint failed` 해결 및 Serializer `read_only_fields` 활용

핵심 기술

이 글은 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와 같이 백엔드에서 계산되거나 생성되는 필드들을 OrderSerializerMeta 클래스에서 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과 같이 명시적으로 기본값을 전달.
  • 테스트: ProductCustomer 모델에 대한 단위 테스트는 성공적으로 수행되었으며, auto_now 필드 테스트를 위해 time.sleep 사용.

개발 임팩트

  • 데이터 무결성 제약 조건을 준수하면서 계산된 필드를 API에서 올바르게 처리할 수 있게 됩니다.
  • DRF Serializer의 read_only_fields 활용법을 이해하여 API 디자인을 개선할 수 있습니다.
  • 클라이언트의 불필요한 데이터 전송을 줄이고 백엔드의 역할에 집중할 수 있습니다.

커뮤니티 반응

톤앤매너

개발자가 겪을 수 있는 구체적인 문제 상황과 해결 과정을 명확하게 제시하며 전문적인 톤을 유지합니다.

📚 관련 자료