дифференцировать нуль = True, пусто = True в Django - PullRequest
764 голосов
/ 23 декабря 2011

Когда мы добавляем поле базы данных в 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?

Ответы [ 12 ]

911 голосов
/ 23 декабря 2011

null=True устанавливает NULL (против NOT NULL) для столбца в вашей БД.Пустые значения для типов полей Django, таких как DateTimeField или ForeignKey, будут сохранены как NULL в БД.

blank=True определяет, будет ли поле заполняться в формах.Это включает в себя администратора и ваши собственные пользовательские формы.Если blank=True, то поле не будет обязательным, тогда как если оно False, поле не может быть пустым.

Комбинация из двух так часто, потому что, как правило, если вы собираетесь разрешить полене заполняйте форму, вам также понадобится база данных, чтобы разрешить значения NULL для этого поля.Исключение составляют CharField с и TextField с, которые в Django никогда не сохраняются как 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 Django, поэтому null=True не требуется.Однако вы можете вручную установить одно из этих полей на None, чтобы принудительно установить его как NULL.Если у вас есть сценарий, в котором это может быть необходимо, вы все равно должны включить null=True.

97 голосов
/ 16 февраля 2014

Вот как ORM отображает blank & null поля для Django 1.8

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
)
35 голосов
/ 16 апреля 2014

Как сказано в Django Model Ссылка на поле: Ссылка

Параметры поля

Следующие аргументы доступны для всех типов полей.Все необязательные.


null

Field.null

Если True, Django будет хранить пустые значениякак NULL в базе данных.По умолчанию False.

Избегайте использования null в полевых строках, таких как CharField и TextField, поскольку пустые строковые значения всегда будут храниться как пустые строки, а не как NULL.Если поле на основе строки имеет null=True, это означает, что оно имеет два возможных значения для «без данных»: NULL и пустую строку.В большинстве случаев избыточно иметь два возможных значения для «нет данных»;соглашение Django состоит в том, чтобы использовать пустую строку, а не NULL.

Как для строковых, так и для нестроковых полей, вам также нужно будет установить blank=True, если вы хотите разрешить пустые значенияв формах, поскольку параметр null влияет только на хранилище базы данных (см. blank).

Примечание

При использовании серверной части базы данных OracleЗначение NULL будет сохранено для обозначения пустой строки независимо от этого атрибута


blank

Field.blank

Если True, поле может быть пустым.По умолчанию False.

Обратите внимание, что это отличается от null.null связан исключительно с базой данных, тогда как blank связан с проверкой.Если поле имеет blank=True, проверка формы позволит ввести пустое значение.Если поле имеет blank=False, поле будет обязательным.

21 голосов
/ 01 декабря 2017

Рассматривая параметры в определении модели Django, важно понимать, что они служат (как минимум) двум целям: определению таблиц базы данных и определению формата по умолчанию и проверке форм моделей. (Я говорю «по умолчанию», потому что значения всегда могут быть переопределены путем предоставления настраиваемой формы.) Некоторые параметры влияют на базу данных, некоторые параметры влияют на формы, а некоторые влияют на оба.

Когда речь идет о null и blank, другие ответы уже дали понять, что первый влияет на определение таблицы базы данных, а второй влияет на проверку модели. Я думаю, что различие можно сделать еще яснее, если рассмотреть варианты использования для всех четырех возможных конфигураций:

  • null=False, blank=False: это конфигурация по умолчанию и означает, что значение требуется при любых обстоятельствах.

  • null=True, blank=True: Это означает, что поле является необязательным при любых обстоятельствах. (Как отмечается ниже, это , а не рекомендуемый способ сделать поля на основе строк необязательными.)

  • null=False, blank=True: это означает, что для формы не требуется значение, а для базы данных. Для этого есть несколько вариантов использования:

    • Чаще всего эта конфигурация используется для необязательных полей на основе строк. Как отмечено в документации , идиома Django состоит в том, чтобы использовать пустую строку для указания отсутствующего значения. Если бы также было разрешено NULL, у вас было бы два разных способа указать пропущенное значение.

    • Другая распространенная ситуация - вы хотите автоматически вычислять одно поле на основе значения другого (скажем, в вашем методе save()). Вы не хотите, чтобы пользователь предоставлял значение в форме (следовательно, blank=True), но вы хотите, чтобы база данных обеспечивала постоянное предоставление значения (null=False).

    • Другое использование этой конфигурации - когда вы хотите указать, что ManyToManyField является необязательным. Поскольку это поле реализовано в виде отдельной таблицы, а не столбца базы данных, null не имеет смысла . Значение blank будет по-прежнему влиять на формы, хотя и определяет, будет ли проверка успешной, если нет отношений.

  • null=True, blank=False: это означает, что для формы требуется значение, а для базы данных - нет. Это может быть самая редко используемая конфигурация, но есть несколько вариантов ее использования:

    • Совершенно разумно требовать, чтобы ваши пользователи всегда включали значение, даже если оно фактически не требуется вашей бизнес-логикой. В конце концов, формы являются лишь одним из способов добавления и редактирования данных. Возможно, у вас есть код, который генерирует данные, которые не нуждаются в той же строгой проверке, которая вам требуется от редактора-человека.

    • Другой пример использования этого, который я видел, это когда у вас есть ForeignKey, для которого вы не хотите разрешать каскадное удаление . То есть при обычном использовании отношение всегда должно быть (blank=False), но если то, на что оно указывает, оказывается удаленным, вы не хотите, чтобы этот объект также был удален. В этом случае вы можете использовать null=True и on_delete=models.SET_NULL для реализации простого вида мягкого удаления .

21 голосов
/ 11 сентября 2014

Просто null=True определяет, что база данных должна принимать NULL значения, с другой стороны blank=True определяет при проверке формы, это поле должно принимать пустые значения или нет (Если blank=True оно принимает форму без значения в этом поле и blank=False [значение по умолчанию] при проверке формы: Это поле обязательно для заполнения ошибка.

null=True/False относится к базе данных

blank=True/False относится к проверке формы

9 голосов
/ 07 сентября 2018

Возможно, у вас есть ответ, однако до сегодняшнего дня трудно судить, следует ли указывать в поле значение null = True или пусто = True или оба. Лично я считаю, что предоставлять разработчикам так много вариантов - бесполезно и запутанно. Позвольте дескриптору обращаться к нулям или пробелам так, как они хотят.

Я следую этой таблице: enter image description here

enter image description here

8 голосов
/ 02 января 2017

Вот пример поля с blank= True и null=True

description = models.TextField (пусто = True, null = True)

В этом случае: blank = True: сообщает нашей форме, что поле описания можно оставить пустым

и

null = True: сообщает нашей базе данных, что можно записать нулевое значение в поле db и не выдавать ошибку.

4 голосов
/ 14 августа 2018

Здесь основное различие между null=True и blank=True:

Значением по умолчанию для null и blank является False.Оба эти значения работают на уровне поля, т. Е. Хотим ли мы сохранить поле 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
4 голосов
/ 16 июля 2018
null = True

Означает, что для поля, которое нужно заполнить, нет ограничений базы данных, поэтому вы можете иметь объект с нулевым значением для заполненного, который имеет эту опцию.

blank = True

Означает, что нетограничение валидации в формах Django.поэтому, когда вы заполните modelForm для этой модели, вы можете оставить поле с этой опцией незаполненным.

3 голосов
/ 18 августа 2018

Есть одна точка, в которой null=True понадобится даже для CharField или TextField, и это когда в базе данных установлен флаг unique для столбца.

Другими словами,если у вас есть уникальный Char / TextField в Django, вам нужно использовать это:

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

Для неуникальных CharField или TextField вам будет лучше пропустить null=True, иначе некоторыеПоля будут установлены как NULL, а другие как "", и вам придется каждый раз проверять значение поля для NULL.

...