Дифференцировать null = True, blank = True в django

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

Ответ 1

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

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

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

Ответ 2

Таким образом 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
)

Ответ 3

Как сказано в Django Model Field, ссылка: Ссылка

Варианты поля

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


null

Field.null

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

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

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

  

Note

     

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


blank

Field.blank

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

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

Ответ 4

Важно понимать, что параметры в определении поля модели 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 для реализации простого вида мягкого удаления.

Ответ 5

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

null=True/False, связанный с базой данных

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

Ответ 6

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

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

enter image description here

Ответ 7

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

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

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

а также

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

Ответ 8

Я думаю, что вы можете быть заинтересованы в Сохраните пустой, обнуляемый CharField как ноль, а не как пустую строку. Есть много дискуссий по этому поводу, и с очень практической проблемой вы можете столкнуться (например, вы хотите добавить URL-адрес openid для каждого пользователя, который может быть нулевым и должен быть уникальным).

Ответ 9

null = True

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

blank = True

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

Ответ 10

Здесь основное отличие от 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

Ответ 11

Когда мы сохраняем что-либо в администраторе Django, выполняется два шага проверки, на уровне Django и на уровне базы данных. Мы не можем сохранить текст в поле числа.

В базе данных есть тип данных NULL, это ничего. Когда Django создает столбцы в базе данных, он указывает, что они не могут быть пустыми. И если вы попытаетесь сохранить NULL, вы получите ошибку базы данных.

Также на уровне Django-Admin все поля обязательны по умолчанию, вы не можете сохранить пустое поле, Django выдает вам сообщение об ошибке.

Итак, если вы хотите сохранить пустое поле, вам нужно разрешить его на уровне Django и Database. blank = True - разрешить пустое поле в панели администратора null = True - позволит сохранить NULL в столбце базы данных.

Ответ 12

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

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

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

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

Ответ 13

Значения по умолчанию null и blank являются False.

Null: это связано с базой данных. Определяет, будет ли данный столбец базы данных принимать нулевые значения или нет.

Пробел: это связано с проверкой. Он будет использоваться во время проверки форм при вызове form.is_valid().

При этом совершенно нормально иметь поле с null = True и пустым = False. Значение на уровне базы данных может быть NULL, но на уровне приложения это обязательное поле.

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

Ответ 14

для NULL == ИСТИНА

    The default value of both null and blank is False. Both of these values work
 at field level i.e., whether we want to keep a field null or blank.

        null=True will set the fields value to NULL i.e., no data. It is 
basically for the databases column value.


        date = models.DateTimeField(null=True)

для ПУСТОЙ == ИСТИНА

    blank=True determines whether the field will be required in forms. This 
includes the admin and your own custom forms.

    title = models.CharField(blank=True) // title can be kept blank. In the 
database ("") will be stored.

нажмите upvote, если вы найдете это полезным

Ответ 15

blank=False - заставить пользователя заполнить это поле.

Ответ 16

В этом посте есть очень хорошие ответы, так что больше нечего сказать, у меня есть бесплатный проект на github для тех, кто только начинает и нуждается в примерах, чтобы узнать больше о Django. Вы можете увидеть репо здесь: https://github.com/renelhs/cellfixstore