NOT NULL 제약 조건 오류 해결: Django DRF 주문 생성 API 디버깅
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- Django 및 DRF API 개발자
- API 직렬화 및 데이터베이스 제약 조건 관련 문제 해결을 필요로 하는 개발자
- 중간 수준의 Python 및 Django 경험 보유자
핵심 요약
total_amount
필드가read_only_fields
로 지정되어 클라이언트 입력 제외, 서버에서 자동 계산OrderSerializer
의Meta
클래스에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_amount
및order_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_save
및pre_delete
신호를 통한 관련 모델 간 연계 관리- 단위 테스트 확장
Order
모델의total_amount
필드 계산 로직 테스트 추가
결론
- 계산 필드는
read_only_fields
로 지정하고default
값을 명시하여 NOT NULL 제약 조건을 해결 - 예:
read_only_fields = ['total_amount']
및default=0.00
적용 - DRF 직렬화 시 클라이언트 입력 필드와 서버 계산 필드를 명확히 구분
read_only_fields
사용을 통해 데이터 무결성 보장