-
TIL.57 null=True 와 blank=True 의 차이(Django)TIL/Django 2020. 12. 5. 15:26728x90
Django에서 Model을 구성할때
null=True 와 blank=True 의 차이는 뭘까?
null 과 blank 는 둘 다 기본값이 False 입니다.
이 두 설정은 모두 필드(열) 수준에서 동작합니다.
즉, 필드(열)를 비워두는 것을 허용할 것인지를 설정합니다.
null=True 는 필드의 값이 NULL(정보 없음)로 저장되는 것을 허용합니다. 결국 데이터베이스 열에 관한 설정입니다.
date = models.DateTimeField(null=True)
blank=True 는 필드가 폼(입력 양식)에서 빈 채로 저장되는 것을 허용합니다. 장고 관리자(admin) 및 직접 정의한 폼에도 반영됩니다.
title = models.CharField(blank=True) # 폼에서 비워둘 수 있음. 데이터베이스에는 ''이 저장됨.
null=True 와 blank=True 를 모두 지정하면 어떤 조건으로든 값을 비워둘 수 있음을 의미합니다. (맨아래내용 반드시 참조)
# 단, CharFields()와 TextFields()에서는 예외입니다.
epic = models.ForeignKey(null=True, blank=True) # 장고는 이 경우 NULL을 저장하지 않으며, 빈 값을 빈 문자열('')로 저장합니다.
이처럼 장고 모델 API는 null 과 blank 비슷한 옵션을 제공한다
- Null : DB와 관련되어 있다. (database-related) 주어진 데이터베이스 컬럼이 null 값을 가질 것인지 아닌지를 정의한다.
- Blank : 유효성과 관련되어 있다. (validation-related) form.is_valid()가 호출될 때 폼 유효성 검사에 사용된다.
위에서 null=True 와 blank=True 를 모두 지정하면 어떤 조건으로든 값을 비워둘 수 있다고 하였지만
많은 개발자들이 실수하는 부분이 CharField, TextField와 같은 문자열 기반 필드에 null=True를 정의하는 것이다.
이 같은 실수를 피해야한다.
그렇지 않으면 “데이터 없음”에 대해 두 가지 값, 즉 None 과 빈 문자열 을 갖게된다.
즉 데이터가 없으면 없는거지 None으로 없는것과 빈 문자열로 없는것이 중복이 된다.
“데이터 없음”에 대해 두 가지 값을 갖는 것은 중복이다.
그리고 무엇보다 Null이 아닌 빈 문자열을 사용하는 것이 장고 컨벤션이다.
만약 문자열 기반의 Model Field를 'nullable'하게 만들고 싶다면 아래와 같이 작성하자
class Person(models.Model): name = models.CharField(max_length=255) # 필수 bio = models.TextField(max_length=500, blank=True) # 선택 (null=True를 넣지 말자) birth_date = models.DateField(null=True, blank=True) # 선택 (여기서는 null=True를 넣을 수 있다.)
또 하나 예외적인 경우가 있습니다. 불리언 필드(BooleanField)에 NULL을 입력할 수 있도록 하려면 null=True 를 설정하는 것이 아니라, 널 불리언 필드(NullBooleanField)를 사용해야 합니다.
출처 : django-orm-cookbook-ko.readthedocs.io/en/latest/null_vs_blank.html
출처 : wayhome25.github.io/django/2017/09/23/django-blank-null/
728x90'TIL > Django' 카테고리의 다른 글
TIL.64 (Token)_Authentication (0) 2020.12.11 TIL.58 Django Rest Framework_serializer(직렬화) (0) 2020.12.06 TIL.54 Httpie를 이용해 통신해보기(Django, MySQL) (0) 2020.12.02 TIL.51 API 란? (0) 2020.11.29 TIL.50 Django Model 과 ORM 정리 (0) 2020.11.28