django에 데이터베이스 필드를 추가하면 일반적으로 다음과 같이 작성됩니다.
models.CharField(max_length=100, null=True, blank=True)
동일은 이루어집니다 ForeignKey
, DecimalField
기본적인 차이가있는에서 무엇인가 등
null=True
뿐blank=True
뿐null=True
,blank=True
다른 (에 대하여 CharField
, ForeignKey
, ManyToManyField
, DateTimeField
) 필드. 1/2/3 사용의 장점 / 단점은 무엇입니까?
답변
null=True
DB의 열에서 NULL
(versus NOT NULL
)를 설정합니다 . Django 필드 유형의 빈 값 (예 : DateTimeField
또는 DB 와 같이) ForeignKey
이 저장됩니다 NULL
.
blank
필드가 양식에 필요한지 여부를 결정합니다. 여기에는 관리자 및 사용자 정의 양식이 포함됩니다. 그렇다면 blank=True
필드는 필요하지 않지만 필드 인 경우 False
비워 둘 수 없습니다.
두 필드의 조합은 너무 빈번합니다. 일반적으로 양식에서 필드를 비워 두려면 NULL
해당 필드의 값 을 허용하기 위해 데이터베이스도 필요하기 때문입니다. 장고에서는으로 저장 되지 않는CharField
s 및 TextField
s 는 예외입니다 . 빈 값은 빈 문자열 ( ) 로 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
CHAR
및 TEXT
유형은 결코로 저장되지 않습니다 NULL
때문에, 장고에 의해 null=True
필요하지 않습니다. 그러나 이러한 필드 중 하나를 수동으로 설정 None
하여 강제로 설정하도록 할 수 있습니다 NULL
. 필요할 수있는 시나리오가있는 경우 여전히을 포함해야합니다 null=True
.
답변
이것이 Django 1.8 의 ORM 맵 blank
및 null
필드 방법입니다
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
인 경우
True
Django는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=False
null=True
on_delete=models.SET_NULL
-
답변
그러나 오늘까지 대답을 할 수도 있지만 필드에 null = True 또는 blank = True 또는 둘 다를 넣을지 여부를 판단하기가 어렵습니다. 개인적으로 개발자들에게 많은 옵션을 제공하는 것은 매우 쓸모없고 혼란 스럽다고 생각합니다. 그러나 널이나 공백을 원하는대로 처리하십시오.
나는 Django의 두 가지 특종 에서이 표를 따릅니다 .
답변
단순히 null=True
데이터베이스가 NULL
값 을 받아 들여야한다고 blank=True
정의하는 반면, 양식 유효성 검사에서이 필드는 빈 값을 허용할지 여부를 정의해야합니다 ( blank=True
해당 필드에 값이없는 blank=False
양식을 승인하고 양식 유효성 검사에서 [기본값] 인 경우이 필드는 필수 오류입니다).
null=True/False
데이터베이스 관련
blank=True/False
양식 검증 관련
답변
다음으로 필드의 일례 인 blank= True
및null=True
설명 = models.TextField (blank = True, null = True)
이 경우 :
blank = True
: 설명 필드를 비워두면됩니다.
과
null = True
: 데이터베이스에 db 필드에 null 값을 기록해도 오류가 발생하지 않는다고 알립니다.