distinguishing null = 참, 공백 = 장고에서 참


902

django에 데이터베이스 필드를 추가하면 일반적으로 다음과 같이 작성됩니다.

models.CharField(max_length=100, null=True, blank=True)

동일은 이루어집니다 ForeignKey, DecimalField기본적인 차이가있는에서 무엇인가 등

  1. null=True
  2. blank=True
  3. null=True, blank=True

다른 (에 대하여 CharField, ForeignKey, ManyToManyField, DateTimeField) 필드. 1/2/3 사용의 장점 / 단점은 무엇입니까?


8
: 당신은 여기에 대한 좋은 답변이 stackoverflow.com/questions/8159310/... 여기 : stackoverflow.com/questions/4384098/...
juliomalegria


예, ForeignKeywith blank=True가 있지만이없는 유스 케이스도 있습니다 null=True. 모델이 저장되면 게시 된 항목을 만들어 자동으로 "게시"하고 싶습니다. 따라서 null모든 모델을 "게시"해야하므로 데이터베이스에 저장할 수 없지만 관리자에서 필드를 비워 둘 수 있기를 원합니다.
osa

[빈 문자열이 아닌 null로 가능한 빈 CharField를 null로 저장]에 관심이 있으신 것 같습니다 ( code.djangoproject.com/ticket/4136 ). 이에 대한 많은 토론이 있으며, 발생할 수있는 매우 실용적인 문제입니다 (예 : null 일 수 있고 고유해야하는 각 사용자에 대해 openid URL을 추가하려고 함).
ramwin

답변:


1081

null=TrueDB의 열에서 NULL(versus NOT NULL)를 설정합니다 . Django 필드 유형의 빈 값 (예 : DateTimeField또는 DB 와 같이) ForeignKey이 저장됩니다 NULL.

blank필드가 양식에 필요한지 여부를 결정합니다. 여기에는 관리자 및 사용자 정의 양식이 포함됩니다. 그렇다면 blank=True필드는 필요하지 않지만 필드 인 경우 False비워 둘 수 없습니다.

두 필드의 조합은 너무 빈번합니다. 일반적으로 양식에서 필드를 비워 두려면 NULL해당 필드의 값 을 허용하기 위해 데이터베이스도 필요하기 때문입니다. 장고에서는으로 저장 되지 않는CharField s 및 TextFields 는 예외입니다 . 빈 값은 빈 문자열 ( ) 로 DB에 저장됩니다 .NULL''

몇 가지 예 :

models.DateTimeField(blank=True) # raises IntegrityError if blank

models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form

분명히이 두 가지 옵션은 논리적으로 사용하기에 적합하지 않습니다 ( null=True, blank=False쉘과 같은 객체를 처리 할 때 선택적으로 필드를 양식으로 항상 사용하려는 경우 사용 사례가있을 수 있음 ).

models.CharField(blank=True) # No problem, blank is stored as ''

models.CharField(null=True) # NULL allowed, but will never be set as NULL

CHARTEXT유형은 결코로 저장되지 않습니다 NULL때문에, 장고에 의해 null=True필요하지 않습니다. 그러나 이러한 필드 중 하나를 수동으로 설정 None하여 강제로 설정하도록 할 수 있습니다 NULL. 필요할 수있는 시나리오가있는 경우 여전히을 포함해야합니다 null=True.


8
IntegrityErrorDjango가 레코드를 데이터베이스에 저장하려고 할 때 발생합니다. 사용자가 필드를 채울 필요는 없으며 데이터베이스 수준에서는 null이 아니기 때문에 문제가됩니다.
Chris Pratt

5
아니요, Chris는 null = True없이 blank = True를 갖는 것이 DateTimeField에 문제를 일으키는 이유를 지적하려고합니다.
Vinod Kurup

4
오라클 사용자에게 참고 : "는 사실이 아니다 CHARTEXT결코로 저장되지 않습니다 NULL장고에 의해". 그것은 대부분의 백엔드에 대한 사실이지만, 장고 오라클 백엔드는 위의 문장에 예외 그래서 오라클은 NULL로 빈 문자열을 강제 장고 문서 도구
STV가

10
@ChrisPratt 게시물에 대한 사소한 수정 : null = True로 설정하면 CharFields 데이터베이스 None에서 Python으로 변환하여 NULL로 저장할 수 있습니다 . 문서는 심지어 "blanky"값의 두 개의 서로 다른 종류의 수 있기 때문에 널 (null) = True로 설정하지 않도록 말한다. 난 그냥 1.8 / MySQL을 5.6 장고와 함께이 동작을 테스트
에드워드 드 수자

3
아무도의 조합을 말할 것 없다 : blank=True, null=False, default="something"?
Brian H.

124

이것이 Django 1.8 의 ORM 맵 blanknull필드 방법입니다

class Test(models.Model):
    charNull        = models.CharField(max_length=10, null=True)
    charBlank       = models.CharField(max_length=10, blank=True)
    charNullBlank   = models.CharField(max_length=10, null=True, blank=True)

    intNull         = models.IntegerField(null=True)
    intBlank        = models.IntegerField(blank=True)
    intNullBlank    = models.IntegerField(null=True, blank=True)

    dateNull        = models.DateTimeField(null=True)
    dateBlank       = models.DateTimeField(blank=True)
    dateNullBlank   = models.DateTimeField(null=True, blank=True)        

PostgreSQL 9.4 용으로 생성 된 데이터베이스 필드 는 다음과 같습니다.

CREATE TABLE Test (
  id              serial                    NOT NULL,

  "charNull"      character varying(10),
  "charBlank"     character varying(10)     NOT NULL,
  "charNullBlank" character varying(10),

  "intNull"       integer,
  "intBlank"      integer                   NOT NULL,
  "intNullBlank"  integer,

  "dateNull"      timestamp with time zone,
  "dateBlank"     timestamp with time zone  NOT NULL,
  "dateNullBlank" timestamp with time zone,
  CONSTRAINT Test_pkey PRIMARY KEY (id)
)

MySQL 5.6 용으로 생성 된 데이터베이스 필드 는 다음과 같습니다.

CREATE TABLE Test (
     `id`            INT(11)     NOT  NULL    AUTO_INCREMENT,

     `charNull`      VARCHAR(10) NULL DEFAULT NULL,
     `charBlank`     VARCHAR(10) NOT  NULL,
     `charNullBlank` VARCHAR(10) NULL DEFAULT NULL,

     `intNull`       INT(11)     NULL DEFAULT NULL,
     `intBlank`      INT(11)     NOT  NULL,
     `intNullBlank`  INT(11)     NULL DEFAULT NULL,

     `dateNull`      DATETIME    NULL DEFAULT NULL,
     `dateBlank`     DATETIME    NOT  NULL,
     `dateNullBlank` DATETIME    NULL DEFAULT NULL
)

41
즉, blank데이터베이스에 영향을 미치지 않으며 null데이터베이스 열이 NULL값을 허용하는지 여부를 제어합니다 . 이 답변은 정말 긴 말이며에 대한 유용한 정보를 제공하지 않습니다 blank.
Carl Meyer

19
@CarlMeyer : 다른 사람들이 동일한 작업을 수행하는 데 시간을 절약 할 수 있기 때문에 데이터베이스에 매핑하고 공유하는 방법을보고 싶었습니다. 이론 대 예제는 메모리를 동화하고 커밋 할 때 차이를 만듭니다. 사실, 내가 사용하지 않은 데이터베이스에 대한 매핑을 추가하지 못했습니다. downvote 주셔서 감사합니다. 이것이 유용하다고 생각한 사람들의 수는 분명히 당신과 동의하지 않습니다.
사용자

5
제시된 데이터에서 요약 결론을 도출하면 유용한 답변 일 수 있지만 원시 데이터 덤프를 제시하는 것이 유용한 답변이라고 생각하지 않습니다. 이 둘의 효과가 있음을 의미한다 (더 코멘트없이) 때문에이 경우에는, 실제로는 오해의 소지가 대답 blank하고는 null사실 때, 데이터베이스 컬럼에 반영해야한다 blank에만 파이썬 처리하지 데이터베이스 컬럼에 영향을 미칩니다. 다른 사람들은 유용하다고 생각하면 자유롭게 투표 할 수 있습니다. 오해의 소지가있는 사람들 이 유용 하다고 생각할 수도 있습니다.
Carl Meyer

4
거의 3 세인 답은 모든 것을 자세히 설명합니다. 여기서 동일한 정보를 반복 할 필요는 없습니다.
사용자

47

장고 모델 필드 참조에서 언급했듯이 : 링크

필드 옵션

다음 필드는 모든 필드 유형에 사용 가능합니다. 모두 선택 사항입니다.


null

Field.null

인 경우 TrueDjango는 NULL데이터베이스에서와 같이 빈 값을 저장 합니다. 기본값은 False입니다.

사용하지 마십시오 null같은 문자열 기반 필드에 CharFieldTextField빈 문자열 값을 항상하지 빈 문자열로 저장되기 때문에 NULL. 문자열 기반 필드에가 있으면 null=True"데이터 없음"에 대한 두 가지 가능한 값 : NULL과 빈 문자열이 있음을 의미합니다. 대부분의 경우 "데이터 없음"에 대해 두 가지 가능한 값을 갖는 것은 중복입니다. 장고 규칙은 빈 문자열을 사용하는 것이 아니라을 사용하는 것 NULL입니다.

문자열 기반 및 문자열이 아닌 필드의 blank=True경우 null매개 변수가 데이터베이스 스토리지에만 영향을 미치므로 양식에서 빈 값을 허용 하려면 설정 해야합니다 (참조 blank).

노트

Oracle 데이터베이스 백엔드를 사용할 때이 속성에 관계없이 빈 문자열을 나타 내기 위해 NULL 값이 저장됩니다.


blank

Field.blank

인 경우 True필드를 비워 둘 수 있습니다. 기본값은 False입니다.

이와는 다릅니다 null. null순전히 데이터베이스 관련이지만 blank유효성 검사 관련입니다. 필드에가 있으면 blank=True양식 유효성 검사를 통해 빈 값을 입력 할 수 있습니다. 필드에가 있으면 해당 필드가 blank=False필요합니다.


46

Django 모델 필드 정의의 옵션은 데이터베이스 테이블 정의와 모델 형식의 기본 형식 및 유효성 검사를 정의하는 데 적어도 두 가지 목적을 제공한다는 것을 이해하는 것이 중요합니다. (사용자 정의 양식을 제공하여 값을 항상 무시할 수 있기 때문에 "default"라고합니다.) 일부 옵션은 데이터베이스에 영향을 미치고 일부 옵션은 양식에 영향을 미치고 일부 옵션은 둘 다에 영향을줍니다.

null와에 관해서는 blank, 다른 대답은 이미 전자가 데이터베이스 테이블 정의에 영향을 미치고 후자는 모델 유효성 검사에 영향을 미친다는 것을 이미 분명히했습니다. 네 가지 가능한 구성 모두에 대한 사용 사례를 보면 구별이 더 명확해질 수 있다고 생각합니다.

  • null=False, blank=False: 이것은 기본 구성이며 모든 상황에서 값이 필요함을 의미합니다.

  • null=True, blank=True: 모든 상황에서이 필드는 선택 사항입니다. (아래에 언급 된 것처럼 문자열 기반 필드를 선택적으로 만드는 권장 방법 은 아닙니다 .)

  • null=False, blank=True: 양식에는 값이 필요하지 않지만 데이터베이스에는 필요합니다. 이에 대한 여러 유스 케이스가 있습니다.

    • 가장 일반적인 용도는 선택적 문자열 기반 필드입니다. 으로 문서에 언급 , 장고 관용구는 누락 된 값을 표시하기 위해 빈 문자열을 사용하는 것입니다. NULL또한 허용 된 경우 결 측값을 표시하는 두 가지 방법으로 끝납니다.

    • 또 다른 일반적인 상황은 다른 필드의 값을 기준으로 한 필드를 자동으로 계산하려는 것입니다 (예 : save()방법). 사용자가 값을 양식으로 제공 blank=True하지 않기를 원하지만 데이터베이스가 값을 항상 제공하도록 강요하기를 원합니다 ( null=False).

    • 또 다른 용도는 a ManyToManyField가 선택 사항 임을 나타내 려는 경우입니다. 이 필드는 데이터베이스 열이 아닌 별도의 테이블로 구현되므로 null의미가 없습니다 . 그러나의 값 blank은 여전히 ​​양식에 영향을 미치며 관계가 없을 때 유효성 검사가 성공할지 여부를 제어합니다.

  • null=True, blank=False: 양식에는 값이 필요하지만 데이터베이스에는 필요하지 않습니다. 가장 빈번하게 사용되는 구성 일 수 있지만 사용 사례가 있습니다.

    • 비즈니스 로직에 실제로 필요하지 않은 경우에도 사용자에게 항상 값을 포함하도록 요구하는 것이 합리적입니다. 결국 양식은 데이터를 추가하고 편집하는 한 가지 방법 일뿐입니다. 휴먼 편집기에서 요구하는 것과 동일한 엄격한 유효성 검증이 필요없는 데이터를 생성하는 코드가있을 수 있습니다.

    • 내가 본 또 다른 유스 케이스는 계단식 삭제를ForeignKey 원하지 않는 경우 입니다. 즉, 정상적인 사용에서는 관계가 항상 있어야하지만 ( ) 관계가 가리키는 것으로 삭제 된 경우이 객체도 삭제하지 않으려 고합니다. 이 경우 간단한 종류의 소프트 삭제 를 사용 하고 구현할 수 있습니다 .blank=Falsenull=Trueon_delete=models.SET_NULL


1
이것은 완벽한 답변입니다. 가능한 모든 조합이 매우 간결하게 설명되어 있습니다!
RusI

1
허용되는 답변이어야합니다.
톰 맥

28

그러나 오늘까지 대답을 할 수도 있지만 필드에 null = True 또는 blank = True 또는 둘 다를 넣을지 여부를 판단하기가 어렵습니다. 개인적으로 개발자들에게 많은 옵션을 제공하는 것은 매우 쓸모없고 혼란 스럽다고 생각합니다. 그러나 널이나 공백을 원하는대로 처리하십시오.

나는 Django의 두 가지 특종 에서이 표를 따릅니다 .여기에 이미지 설명을 입력하십시오

각 필드 유형에 null 또는 공백을 사용하는시기를 보여주는 표


26

단순히 null=True데이터베이스가 NULL값 을 받아 들여야한다고 blank=True정의하는 반면, 양식 유효성 검사에서이 필드는 빈 값을 허용할지 여부를 정의해야합니다 ( blank=True해당 필드에 값이없는 blank=False양식을 승인하고 양식 유효성 검사에서 [기본값] 인 경우이 필드는 필수 오류입니다).

null=True/False 데이터베이스 관련

blank=True/False 양식 검증 관련


11

다음으로 필드의 일례 인 blank= Truenull=True

설명 = models.TextField (blank = True, null = True)

이 경우 : blank = True: 설명 필드를 비워두면됩니다.

null = True: 데이터베이스에 db 필드에 null 값을 기록해도 오류가 발생하지 않는다고 알립니다.


7

여기에와의 주요 차이점은 다음 null=Trueblank=True같습니다.

모두의 기본값 nullblankFalse입니다. 이 값은 모두 우리가 필드를 유지할지 여부, 필드 레벨의 예에서 일을 null하거나 blank.

null=True필드 값을 NULL즉 데이터 없음으로 설정합니다. 기본적으로 데이터베이스 열 값입니다.

date = models.DateTimeField(null=True)

blank=True필드가 양식에 필요한지 여부를 결정합니다. 여기에는 관리자 및 사용자 정의 양식이 포함됩니다.

title = models.CharField(blank=True) // title can be kept blank. 데이터베이스에 ("")저장됩니다. null=True blank=True이는 모든 상황에서 필드가 선택 사항임을 의미합니다.

epic = models.ForeignKey(null=True, blank=True)
// The exception is CharFields() and TextFields(), which in Django are never saved as NULL. Blank values a

6
null = True

필드를 채울 데이터베이스에 대한 제약 조건이 없음을 의미하므로이 옵션이있는 채움 값이 null 인 개체를 가질 수 있습니다.

blank = True

장고 양식에서 유효성 검사의 제약이 없음을 의미합니다. modelForm따라서이 모델 을 채울 때이 옵션을 채우지 않은 채로 필드를 남길 수 있습니다.


6

널과 공백의 기본값은 False입니다.

널 : 데이터베이스 관련입니다. 주어진 데이터베이스 열이 null 값을 허용할지 여부를 정의합니다.

공백 : 유효성 검사와 관련이 있습니다. form.is_valid ()를 호출 할 때 양식 유효성 검증 중에 사용됩니다.

즉, null = True 및 blank = False 인 필드를 갖는 것이 좋습니다. 데이터베이스 수준에서 필드는 NULL 일 수 있지만 응용 프로그램 수준에서는 필수 필드입니다.

이제 대부분의 개발자가 잘못한 부분 : CharField 및 TextField와 같은 문자열 기반 필드에 대해 null = True 정의 그렇게하지 마십시오. 그렇지 않으면 "데이터 없음 "에 대해 두 가지 가능한 값, 즉 없음 과 빈 문자열이 생깁니다. "데이터 없음"에 대한 두 가지 가능한 값을 갖는 것은 중복입니다. Django 규칙은 NULL이 아닌 빈 문자열을 사용하는 것입니다.


5

Django admin에 아무것도 저장하면 Django 수준과 데이터베이스 수준에서 두 단계의 유효성 검사가 수행됩니다. 숫자 필드에 텍스트를 저장할 수 없습니다.

데이터베이스의 데이터 유형은 NULL입니다. Django가 데이터베이스에서 열을 만들면 열을 비울 수 없도록 지정합니다. 그리고 NULL을 저장하려고하면 데이터베이스 오류가 발생합니다.

또한 Django-Admin 수준에서는 기본적으로 모든 필드가 필요하며 빈 필드를 저장할 수 없으므로 Django에서 오류가 발생합니다.

따라서 빈 필드를 저장하려면 장고 및 데이터베이스 수준에서 허용해야합니다. blank = True-관리자 패널에서 빈 필드를 허용합니다. null = True-데이터베이스 열에 NULL을 저장할 수 있습니다.


5

또는 null=True에 필요한 지점 이 있으며 데이터베이스 에 열에 설정된 플래그 가있을 때 입니다.CharFieldTextFieldunique

즉, Django에 고유 한 Char / TextField가있는 경우 다음을 사용해야합니다.

models.CharField(blank=True, null=True, unique=True)

고유하지 않은 CharField 또는 TextField의 null=True경우 건너 뛰는 것이 좋습니다. 그렇지 않으면 일부 필드는 NULL로 설정되고 다른 필드는 ""로 설정되며 매번 NULL의 필드 값을 확인해야합니다.


3

null 은 데이터베이스 용이며 공백 은 사용자의 성을 얻기 위해 textfield와 같은 사용자 인터페이스에 표시하려는 필드 유효성 검사 용입니다. 경우 LASTNAME = models.charfield (빈 = TRUE) 이 옵션 필드가 지금처럼 그것은 성을 입력하는 사용자에게 didnot. lastname = models.charfield (null = true) 인 경우이 필드가 사용자로부터 값을 가져 오지 않으면 데이터베이스에 빈 문자열 ""로 저장됩니다.


1

모델에서 null = True 및 blank = True의 의미는 이러한 필드가 양식 클래스에서 정의 된 방법에 따라 다릅니다.

다음 클래스를 정의했다고 가정하십시오.

class Client (models.Model):
    name = models.CharField (max_length=100, blank=True)
    address = models.CharField (max_length=100, blank=False)

양식 클래스가 다음과 같이 정의 된 경우 :

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']
        widgets = {
            'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
            'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
        }

그런 다음 '이름'필드는 필수가 아니며 (모델의 blank = True로 인해) '주소'필드는 필수입니다 (모델의 blank = False로 인해).

그러나 ClientForm 클래스가 다음과 같이 정의 된 경우 :

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']

    name = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )
    address = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )

그런 다음 두 필드 ( 'name'및 'address')는 필수입니다. "선언적으로 정의 된 필드는 그대로 유지되므로" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) 즉, 양식 필드의 '필수'속성의 기본값은 True이므로 모델에서 필드가 blank = True로 설정된 경우에도 'name'및 'address'필드를 채워야합니다.



0

아래 표는 주요 차이점을 보여줍니다.

+--------------------------------------------------------------------+
| Purpose                  | null=True        | blank = True         |
|--------------------------|------------------|----------------------|
| Field can be empty in DB | Do this          | Unaffected           |
|--------------------------|------------------|----------------------|
| ModelForm(required field)| Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| Form Validation          | Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| on_delete=SET_NULL       | Need this        | Unaffected           |
+--------------------------------------------------------------------+

0

아주 간단하게 말하면 ,

공백은 널과 다릅니다.

null순전히 데이터베이스와 관련 이있는 반면 blank는 유효성 검사와 관련이 있습니다 (양식 필요) .

그렇다면 null=True장고는 그렇게 할 것이다 store empty values as NULL in the database. 필드가 있으면 blank=True양식 유효성 검사가 수행됩니다 allow entry of an empty value. 필드에 blank = False가 있으면 필드가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.