본문 바로가기
개발일지/Django

Django - (fields.E320)models on_delete=SET_NULL ERRORS 해결

by 개발에정착하고싶다 2023. 1. 2.
SystemCheckError: System check identified some issues:

ERRORS:
blog.Post.author: (fields.E320) Field specifies on_delete=SET_NULL, 
but cannot be null.
        HINT: Set null=True argument on the field, or change the on_delete rule.

models에 추가하는 방법 중

on_delete=SET_NULL을 입력하게 되면

이 뜻은 "만약 연결되어있는 지금 필드의 존재가 사라지더라도 데이터는 남길게"라는 뜻이라고 보면 될것같습니다.

(불확실함, 왜냐하면 말 자체가 NULL을 setting한다는 의미니깐)

(그런데 테스트 해보니깐 결과론적으로 작성자를 삭제하더라도 on_delete=SET_NULL옵션을 쓰게되면

해당 작성자의 계정이 삭제될 경우, 작성자가 None으로 바뀔뿐이지 데이터가 삭제되진않음)

 

하지만 중요한것은 처음에 올려드린 error 메세지에 대한 해결 방법입니다.

 

# 해결방법

맨 첫째줄은 무시해도됨

ERRORS: 밑부터 봐보자.

blog(앱단위).

Post(정의된 클래스인데 보통 이 에러는 models에 나오는 에러기 때문에 blog/models/Post라고 일단 봐도 될것같다).

author(Post라고 정의되어있는 클래스의 속성중 하나인 author)

에 "on_delete=SET_NULL"이 되어있어,

그런데 그건 null(빈값,공백)을 쓸수 없어

힌트: 추가적으로 null=True라고 넣어주거나, on_delete를 룰에 맞게 넣어줘봐

 

즉, 첫번째 방법은 기존의 문제가 생기던 null에 대한 정의가 없는

author = models.ForeignKey(User, on_delete=models.SET_NULL)

의 상태에서

author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

이렇게 ()안에 위치는 상관없으니깐 null=True를 넣어주거나

아니면 on_delete를 본인이 아는 null에 대해 충돌에러가 발생하지 않게 변경해주면 된다.