장고 모델의 필드에서는 null과 blank 옵션이 존재합니다. null은 데이터베이스에서 필드가 NULL값을 가질 수 있는지, blank는 폼에서 입력하지 않아도 가능한지를 지정하는 옵션입니다. 이들의 기본값을 따로 설정을 하지 않는다면 False로 지정됩니다. 어느 정도로는 바로 이해가 되나, 문자열필드나 관계형 필드를 마주할 때 헷갈리곤 합니다. 그러기에 명확하게 각 필드별 blank, null의 기능에 대해 정리해 보도록 하겠습니다.
일반 필드
문자열 필드도 아니고, 관계형 필드도 아닌 일반적인 IntegerField, DateField와 같은 필드들은 크게 헷갈릴 것이 없습니다. null=True라면 값을 지정해주지 않았을 때 NULL로 DB에 저장되고, blank=True로 하면 폼에서 값을 지정해주지 않을 수 있습니다. 다만 null=False, blank=True로 설정한다면 폼에서는 값을 입력받지 않을 수 있지만 DB에서는 반드시 값을 요구하기에 DB 무결성 오류가 발생합니다.
일반 필드 | null=True | null=False |
blank=True | 값이 없을시에 NULL로 저장됨 | 폼으로 값을 지정해주지 않으면 DB단에서 오류 발생 |
blank=False | 폼 입력시엔 값이 필수지만, 폼이 아닌 다른경로로 입력하며 값을 지정해주지 않는다면 NULL로 저장 | 값 필수 |
문자열 필드
CharField, TextField 등은 문자열의 특성 때문에 애매한 부분이 발생합니다. 정수형 등에서는 공백이라는 값이 존재할 수 없지만, 문자열은 그냥 공백 ""이 입력될 수 있는데, 이를 값이 없는 NULL로 보아야 할지, ""라는 공백이라는 값이 존재하는 것으로 보아야 할지 혼동이 발생합니다.
그렇기에 문자열에 반드시 NULL 지정이 필요 없다면 개인적으로 권장하는 방식은 blank=True, null=False로 사용하는 것입니다.
ForeignKey
외래키 필드는 기본적으로 다른 필드의 pk값을 저장하기에 정수형 필드입니다. 그렇기에 다음과 같이 작동합니다.
ForeignKey | null=True | null=False |
blank=True | 외래키 연결이 필수가 아님 | 폼으로 값을 지정해주지 않으면 DB단에서 오류 발생 |
blank=False | 폼 입력시엔 값이 필수지만, 폼이 아닌 다른경로로 입력하며 값을 지정해주지 않는다면 NULL, 즉 외래키 연결이 없는것으로 간주 | 외래키 연결 필수 |
ManyToManyField
M:N 연결을 지원하는 필드는 다른 필드와는 다른 방식으로 작동합니다. 이는 바로 실제로 필드가 만들어지는 것이 아닌, 연결할 두 모델사이에 자동으로 중간모델을 생성하는 방식으로 작동합니다. 즉 실제로 연결하는 두 모델에는 필드가 존재하지 않는 것이죠. 이로 인하여 null=False이던 null=True이던 영향을 미치지 않습니다. 실제로는 필드가 없는 것이니깐요. 그렇기에 작동방식은 다음과 같이 이루어집니다.
ManyToManyField | null=True | null=False |
blank=True | 연결이 필수가 아님 | 연결이 필수가 아님 |
blank=False | 폼 입력시에는 필수로 연결을 요구함 | 폼 입력시에는 필수로 연결을 요구함 |
'파이썬 (Python) > 장고 (Django)' 카테고리의 다른 글
Django 테스트 개선기(의존성 벗어나기) (0) | 2024.03.24 |
---|---|
Django에 redis 캐싱 적용하기 (0) | 2024.02.09 |
[Django Basic] 4. Template (0) | 2023.08.03 |
dj-rest-auth 소셜 로그인(OAuth)에 대하여 (0) | 2023.07.27 |
[Django Basic] 4. View, views.py (0) | 2023.07.27 |