1. null (database-related)
DB와 관련되어 있다. 주어진 데이터베이스 컬럼이 null 값을 가질 것인지 아닌지를 정의한다. default 값은 False 이다.
- True : Django will store empty values as NULL in the database.
- False :
2. blank (validation-related)
유효성과 관련되어 있다. form_is_vaild()
가 호출될 때 폼 유효성 검사에 이용된다. default 값은 False 이다.
- True : form validation will allow entry of an empty value.
- False : the field will be required.
class Person(models.Model):
name1 = models.CharField(max_length=255) # 폼에서 빈값으로 제출하면 허용하지 않는다.
name2 = models.CharField(max_length=255, blank=True) # 폼에서 빈값으로 제출하면 DB에 빈 문자열로 저장된다.
name3 = models.CharField(max_length=255, null=True, blank=True) # 폼에서 빈값으로 제출하면 DB에 null로 저장된다.
두 설정은 모두 필드를 비워두는 것을 허용할 것인지에 대한 설정이다. 테이블을 생성하다보면 두 설정들을 언제 쓰는 것이 적절한지 혼동될 때가 많다. 이에 대한 가이드를 제시한다.
필드 타입 | null=True로 설정하기 | blank=True로 설정하기 |
---|---|---|
CharField, TextField 등의 문자열 기반 필드 | 이용하지 않는다. 장고 표준은 빈 값(empty_value)을 빈 문자열(empty_string)로 저장하는 것이다. 빈 값(empty_value)에 대해서 두 가지 값을 중복하여 가지게 될 위험이 있으므로, Null 이 아닌 빈 문자열(empty_string)로 표현하는 것을 권장한다. | 이용한다. 위젯이 빈 값(empty_value)을 허용하기를 원한다면 설정한다. 이렇게 설정하면 데이터베이스에 빈 값이 빈 문자열로 저장된다. |
FileField, ImageField | 이용하지 않는다. 장고는 MEDIA_ROOT의 경로를 CharField에 파일 또는 이미지로 저장한다. 따라서 같은 패턴이 FileField에도 적용된다. | 이용한다. CharField에 적용된 것과 같은 규칙이 적용 된다. |
BooleanField | 이용하지 않는다. 대신 NullBooleanField를 이용한다. | 이용하지 않는다. |
⚡ (TIP) 필드타입을 최대한 타이트하게 지정해주자
blank/null
을 적절하게 쓰는 것도 문제지만, 쓰는 빈도도 최소화하여 쓰도록 하자. ORM은 결국 SQL 쿼리를 만들어주는 역할일 뿐, 우리는 데이터베이스 정규화(normalization)에 익숙해져야 한다. blank/null
을 여기저기 쓰기보다는 validatiors
추가하여 타이트하게 만들어주자.
BinaryField
로부터 파일을 직접 서비스하는 것은 자제하자. 바이너리 데이터는 그 크기가 방대할 수도 있고 그로 인해 데이터베이스가 느려질 수 있다. 실제로 그런 경우가 발생해서 바디너리 데이터 저장이 병목 지점이 된다면, 해당 데이터를 파일 형태로 저장하고 FileField
에 레퍼런스만 저장하는 방법으로 해결할 수 있다.
- 데이터베이스의 '읽기/쓰기' 속도는 항상 파일 시스템의 '읽기/쓰기' 속도보다 느리다.
- 데이터베이스 백업에 드는 공간과 시간이 점점 증가하게 된다.
- 파일 자체에 접근하는 데 앱(장고) 레이어와 데이터베이스 레이어 둘 다를 거쳐야만 한다.