AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

NOT NULL 제약 조건 오류 해결: Django DRF 주문 생성 API 디버깅

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • Django 및 DRF API 개발자
  • API 직렬화 및 데이터베이스 제약 조건 관련 문제 해결을 필요로 하는 개발자
  • 중간 수준의 Python 및 Django 경험 보유자

핵심 요약

  • total_amount 필드가 read_only_fields로 지정되어 클라이언트 입력 제외, 서버에서 자동 계산
  • OrderSerializerMeta 클래스에 read_only_fields = ['order_date', 'total_amount', 'status'] 적용
  • total_amount 필드에 default=0.00 명시적으로 설정하여 NOT NULL 제약 조건 충족
  • create 메서드 내 order = Order.objects.create(**validated_data) 호출 시 기본값 적용
  • price_at_order 필드는 read_only_fields로 클라이언트 입력 거부
  • OrderItemSerializer에서 read_only_fields = ['price_at_order'] 적용

섹션별 세부 요약

1. 문제 발생: `NOT NULL constraint failed: orders_order.total_amount`

  • total_amount 필드가 NULL로 입력됨
  • 클라이언트가 데이터를 직접 제공하지 않아 계산 필드인 total_amount이 누락됨
  • Django ORM의 NOT NULL 제약 조건 위반
  • Order 모델의 total_amount 필드가 blank=False, null=False로 정의되어 있음

2. 단위 테스트 통과: `Product` 및 `Customer` 모델 검증

  • Product 모델 테스트
  • 생성, 기본값, __str__ 메서드, updated_at 자동 업데이트, 삭제 테스트 완료
  • Customer 모델 테스트
  • 동일한 검증 프로세스 수행
  • 모델 정의 오류 확인
  • 모델 자체는 문제가 없음, 문제는 직렬화 과정에서 발생

3. 해결 방안: `read_only_fields` 및 `default` 설정

  • OrderItemSerializer에서 price_at_order 필드 제외
  • read_only_fields = ['price_at_order'] 적용
  • OrderSerializer에서 total_amountorder_date 필드 제외
  • read_only_fields = ['order_date', 'total_amount', 'status'] 적용
  • total_amount 필드에 default=0.00 명시
  • serializer.create() 메서드에서 Order.objects.create(**validated_data) 호출 시 기본값 적용

4. 추가 개선: `signals.py` 및 테스트 확장

  • signals.py 파일 추가
  • post_savepre_delete 신호를 통한 관련 모델 간 연계 관리
  • 단위 테스트 확장
  • Order 모델의 total_amount 필드 계산 로직 테스트 추가

결론

  • 계산 필드는 read_only_fields로 지정하고 default 값을 명시하여 NOT NULL 제약 조건을 해결
  • 예: read_only_fields = ['total_amount']default=0.00 적용
  • DRF 직렬화 시 클라이언트 입력 필드와 서버 계산 필드를 명확히 구분
  • read_only_fields 사용을 통해 데이터 무결성 보장