django 모델링 작업을 하던 중, 이론적으로 명확하지 않던 것들이 몇 가지 있었는데 그 중 하나가 null
, blank
와 관련된 설정이었다.
이번 기회에 관련 내용을 정리해보고자 한다.
null
은 blank('')
와 같지 않다.
null
: 값도 없고 0도 아닌, null인 상태. 의도적으로 값을 비워둔 상태에 가깝다 blank
: 공란, False(0)인 상태 이 부분을 먼저 알아야 내용을 이해하기 수월하다.
django 모델링에서 field를 정의할 때, null
과 blank
는 기본값이False
며, 내용을 비우는 것과 관련된 설정이다. 다만 적용되는 level의 관점에서 이 둘은 조금 다르다.
''
를 가지는지 아닌지를 결정한다#date 필드가 null로 저장되는 것을 허용
date = models.DateTimeField(null=True)
#입력 단계에서 값 비워두기 가능. DB에는 ''로 저장된다
title = models.CharField(blank=True)
null
이 True
이고, blank
가 False
라면:
DB 레벨에서는 해당 column이 null값을 가질 수 있으나 입력 단계에서는 input값이 must란 얘기다.
null
과 blank
를 둘 다 True
로 설정하는 경우도 있다:
이는 어떤 level에서든 값이 없는 상태로 지정할 수 있음을 말한다.
위에서 null
과 blank
를 둘다 True
로 설정할 수 있음을 언급했다.
image = Foreignkey(null=True, blank=True)
여기서 2가지 예외 사항이 존재한다.
첫 째, charfield
와 textfield
는 null=True
를 설정하지 않는다.
이 2개 필드는 데이터가 없는 상태에 대해 ''
를 갖는다. 그래서 null=True
를 설정하면 null과 blank 모두를 갖게 되는 셈.
그래서 null=True
를 설정해도 django는 ''
를 저장한다.
둘 째, booleanfield
는 null=True
설정이 불가능하다.
따라서, 이 경우 nullbooleanfield
를 사용해야 한다.
#공식문서 예시 - NullBooleanField may be used with widgets such as Select by providing the widget choices
NullBooleanField(
widget=Select(
choices=[
('', 'Unknown'),
(True, 'Yes'),
(False, 'No'),
]
)
)
null을 default값으로 설정하려면, default=null
이라고 쓰면 될까? 답은 아니다.
django는 python 기반 웹 프레임워크이다.
python 에는 null
이 없고 None
이 있으며, 따라서 django에서도 default=null
이라고 설정할 수 없다.
(python 에서는 None
이 null에 대응하며, 타입은 NoneType
이다.)
따라서, default=None
, null=True
라고 설정해야 한다.
#작업했던 models.py의 실제 예시
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, default=None)
참고 자료
https://django-orm-cookbook-ko.readthedocs.io/en/latest/null_vs_blank.html
https://wayhome25.github.io/django/2017/09/23/django-blank-null/
https://docs.djangoproject.com/en/4.0/ref/forms/fields/
https://stackoverflow.com/questions/4604814/django-model-field-default-to-null