웹프로그래밍/Django
[Django] Model Field의 Null vs Blank
ssung.k
2020. 8. 6. 20:53
django에서는 기본적으로 orm을 지원해주고 있습니다. 따라서 테이블을 생성할 때도 orm으로 생성할 수 있습니다. 테이블을 생성하다보면 필드 옵션으로 null와 blank 속성이 존재하고 이는 꽤나 헷갈리는 내용입니다. 따라서 이번 포스팅에서는 각각에 대해 알아보도록 하겠습니다.
Null vs Blank
Null
은 데이터베이스와 관련되어 있습니다. 기본값은 false로 Null
을 허용하지 않으며, True로 할 시에는 데이터베이스에 Null
값을 저장할 수 있습니다.
Blank
는 유효성과 관련되어 있습니다. 기본값은 false로 해당 필드 없이 저장하고자 하면 유효성 검사에서 걸러지며, True로 할 시에는 해당 필드가 없어도 정상적으로 동작합니다.
다음과 같은 모델을 만들고 이에 대한 쿼리를 확인한 결과 아래와 같았습니다.
DB는 mysql 8 버전을 사용하였습니다.
class NullBlank(models.Model):
nothing = models.TextField()
null_only = models.TextField(null=True)
blank_only = models.TextField(blank=True)
both = models.TextField(null=True, blank=True)
CREATE TABLE `plant_nullblank` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nothing` longtext NOT NULL,
`blank_only` longtext NOT NULL,
`both` longtext,
`null_only` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
다음 결과와 같이 Blank
는 데이터베이스에 아무런 영향을 주지 않는 것을 확인할 수 있습니다.
그리고 위의 테이블 정의는 해당 필드에서 한 가지 문제점이 생깁니다.
null_only = models.TextField(null=True)
문자열 기반 필드에는 Null
을 True로 설정할 경우 문제가 생깁니다. Null
이 의미하는 데이터없음 을 문자열에서는 빈 문자열로 표현할 수 있기 때문이죠. 즉, 데이터없음 에 대해서 두 가지 값을 중복하여 가지게 되므로 Null
이 아닌 빈 문자열로 표현하는 것을 django에서 권유하고 있습니다.