[python] distinguishing null = 참, 공백 = 장고에서 참

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 사용의 장점 / 단점은 무엇입니까?



답변

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.


답변

이것이 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
)


답변

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

필드 옵션

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

null

Field.null

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

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

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

노트

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

blank

Field.blank

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

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


답변

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


답변

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

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

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


답변

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

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

blank=True/False 양식 검증 관련


답변

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

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

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

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