본문 바로가기

Django

django.db.utils.IntegrityError: NOT NULL constraint failed

메세지만 읽어도 nullable하지 않은 데에 값을 안 넣었구나 싶은 에러다. 설 연휴 때 장고 책을 보고 따라하다 save(commit=False)를 기억하기 위해 일부러 내 보았다.

참고한 장고 책에서는 not null인 생성일 데이터를 timezone.now()로 직접 입력하게 안내했다. 하지만 나는 책을 따라가는 초반부터 auto_now_add 속성을 사용해 생성일을 자동으로 넣게 만들었으므로 다른 테이터를 가지고 연습했다.

 

질의응답 게시판의 답변은 반드시 질문을 참조해야 되는 모델을 만들었다. 따라서 답변의 question이 not null이어야 한다.

def answer_create(request, question_id):
	question = get_object_or_404(Question, pk=question_id)
    
    if request.method == 'POST':
        form = AnswerForm(request.POST)
        if form.is_valid():
        answer = form.save(commit=False)
        answer.question = question
        answer.save()
(후략)

답변을 등록하는 answer_create의 코드는 위와 같다. 답변 폼에서 받은 정보를 바로 답변 데이터로 저장하지 않고 commit=False를 통해 저장을 유예했다. 그리고 답변이 참조하는 질문의 객체를 넣은 뒤에 save했다.

이 때 answer.question = question 라인을 주석처리하면 답변이 어느 질문의 답변인지를 넣지 않고 데이터를 저장하려는 셈이니 IntegrityError가 난다.