django를 처음 접했을 때, 헷갈리던 것이 null=True 옵션과 blank=True 옵션이였습니다. 이 둘에 대해 간단하게 알아보겠습니다.

 


 먼저, null=True 값을 주고 migration을 해 보겠습니다.

 

 

 myapp_post 테이블을 생성하는 쿼리를 봅시다. 그러면 post에 NULL이 붙어 있는 것을 볼 수 있는데요. 이는 널 값을 허용한다는 의미입니다. 저는 sqlite를 써서 쿼리가 요래 생성되었습니다.

 

 

 그냥 아무런 값도 추가하지 않았더니 NULL이 들어간 것을 볼 수 있습니다. NULL 값을 추가한 다음에 장고 어드민에서 해당 포스트를 수정해 보겠습니다.

 

 

 빈 값으로 냅뒀더니, This field is required 라고 뜹니다. 이는 null=True 옵션이 Form에서 빈 값을 허용하는 옵션이 아니기 때문입니다. 새로운 포스트를 생성하는 액션을 추가하고 테스트를 해 봅시다.

 

 

 create_post는 단순히 빈 포스트를 추가하는 액션입니다. 이 액션을 등록한 후, 다시 어드민에 들어가 보면 Create Post 액션이 추가되어 있습니다.

 

 

 2번 포스트를 선택하고 Create post 액션을 선택한 후, Go를 눌러봅시다. 그 다음에, sqlite에 어떻게 반영되었는지 봅시다.

 

 

 

 NULL이 들어가 버립니다. empty value로 주었는데요. null=True 옵션이였기 때문에, 널 값이 들어가 버린 셈입니다. 그리고 문서에서 보면, string based 필드에서 null=True를 권장하지 않는다고 언급되어 있습니다. 이는 빈 값이 NULL, "" 이렇게 두 가지가 나오기 때문입니다.

 

 추가로 문서에 언급된 것은 oracle backend인 경우, 다르게 동작한다고 되어 있습니다. 이 부분만 유념하시면 될 듯 합니다.

 


 blank=True는 무엇일까요? 이것은, 빈 문자열을 허용하는 옵션입니다. 문서에 따르면, validation과 관련된 옵션이라고 되어 있습니다. 요래 변경하고 다시 마이그레이션을 해 보겠습니다.

 

 그러면, myapp_post 테이블 생성 쿼리를 보면, "post"가 NOT NULL임을 볼 수 있습니다. 이는, 장고에서 null을 default로 False로 두고 있기 때문입니다. 결국 null flag는 테이블에 널 값을 허용하는지 여부이고, blank=True는 폼에서의 validation, 빈 값을 허용하는 것과 관련된 옵션임을 알 수 있습니다. 저는 보통, 빈 값을 허용하는 경우, default 값을 ""로, 즉 빈 문자열로 설정해 버립니다.

 

 

 이제, 1번 object의 post를 빈 문자열로 설정해 보겠습니다.

 

 

 성공적으로 바뀐 것을 확인할 수 있습니다. 벨리데이션을 통과했기 때문입니다.