[django] null과 blank

EMMA·2022년 7월 20일
1

django 모델링에서 많이 사용하는 null과 blank

django 모델링 작업을 하던 중, 이론적으로 명확하지 않던 것들이 몇 가지 있었는데 그 중 하나가 null , blank 와 관련된 설정이었다.

이번 기회에 관련 내용을 정리해보고자 한다.


null 과 blank

nullblank('')와 같지 않다.

  • null : 값도 없고 0도 아닌, null인 상태. 의도적으로 값을 비워둔 상태에 가깝다
  • blank : 공란, False(0)인 상태

이 부분을 먼저 알아야 내용을 이해하기 수월하다.

null vs blank

django 모델링에서 field를 정의할 때, nullblank는 기본값이False 며, 내용을 비우는 것과 관련된 설정이다. 다만 적용되는 level의 관점에서 이 둘은 조금 다르다.

  • null: DB level, 해당 field가 null값을 가지는지 아닌지를 결정한다
  • blank: 유효성 level, 즉, 입력 양식에서 ''를 가지는지 아닌지를 결정한다
#date 필드가 null로 저장되는 것을 허용 
date = models.DateTimeField(null=True)

#입력 단계에서 값 비워두기 가능. DB에는 ''로 저장된다 
title = models.CharField(blank=True) 

nullTrue 이고, blankFalse 라면:
DB 레벨에서는 해당 column이 null값을 가질 수 있으나 입력 단계에서는 input값이 must란 얘기다.

nullblank를 둘 다 True로 설정하는 경우도 있다:
이는 어떤 level에서든 값이 없는 상태로 지정할 수 있음을 말한다.


Exceptions

위에서 nullblank를 둘다 True로 설정할 수 있음을 언급했다.

image = Foreignkey(null=True, blank=True) 

여기서 2가지 예외 사항이 존재한다.

첫 째, charfieldtextfieldnull=True를 설정하지 않는다.
이 2개 필드는 데이터가 없는 상태에 대해 ''를 갖는다. 그래서 null=True를 설정하면 null과 blank 모두를 갖게 되는 셈.

그래서 null=True를 설정해도 django는 ''를 저장한다.

둘 째, booleanfieldnull=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'),
        ]
    )
)

default로 null을 설정하는 방법

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

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글