Когда мы добавляем поле базы данных в 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?
python
django
django-models
user993563
источник
источник
ForeignKey
сblank=True
, но безnull=True
. Когда модель сохранена, я хочу автоматически «опубликовать» ее, создав из нее опубликованную запись. Поэтому я не могу сохранитьnull
в базе данных, так как каждая модель должна быть «опубликована», но я хочу иметь возможность оставить поле пустым в admin.Ответы:
null=True
устанавливаетNULL
(противNOT NULL
) на столбец в вашей БД. Пустые значения для типов полей Django, таких какDateTimeField
или,ForeignKey
будут сохранены какNULL
в БД.blank
определяет, будет ли поле заполнено в формах. Это включает в себя администратора и ваши пользовательские формы. Еслиblank=True
тогда поле не будет обязательным, тогда как если этоFalse
поле не может быть пустым.Комбинация из двух так часто, потому что, как правило, если вы хотите, чтобы поле в форме было пустым, вам также понадобится база данных, чтобы разрешить
NULL
значения для этого поля. Исключение составляютCharField
s иTextField
s, которые в Django никогда не сохраняются какNULL
. Пустые значения хранятся в БД в виде пустой строки (''
).Несколько примеров:
Очевидно, что эти два параметра не имеют логического смысла для использования (хотя может быть вариант использования,
null=True, blank=False
если вы хотите, чтобы поле всегда требовалось в формах, необязательно при работе с объектом через что-то вроде оболочки.)CHAR
иTEXT
типы никогда не сохраняются какNULL
в Django, так что вnull=True
этом нет необходимости. Тем не менее, вы можете вручную установить одно из этих полей,None
чтобы принудительно установить его какNULL
. Если у вас есть сценарий, где это может быть необходимо, вы все равно должны включитьnull=True
.источник
IntegrityError
возникает, когда Django пытается сохранить запись в базе данных. Поле не обязательно должно быть заполнено пользователем, и это проблема, потому что на уровне базы данных оно не равно нулю.CHAR
иTEXT
НИКОГДА не сохраняются какNULL
в Django». Это верно для большинства бэкэндов, но Oracle принудительно возвращает пустую строку в NULL, поэтому бэкэнд Django Oracle является исключением из вышеприведенного оператора Django DocsNone
Python), если вы установите null = True. В документах даже говорится, что следует избегать установки значения null = True, поскольку оно допускает два разных типа «пустых» значений. Я только что проверил это поведение с Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?Это как ORM карты
blank
иnull
поля для Django 1.8Поля базы данных, созданные для PostgreSQL 9.4 :
Поля базы данных, созданные для MySQL 5.6 :
источник
blank
не влияет на базу данных иnull
контролирует, допускает ли столбец базы данныхNULL
значения. Этот ответ - очень длинный способ сказать это, и не предоставляет никакой полезной информации оblank
.blank
иnull
должен отражаться в столбцах базы данных, когда фактическиblank
влияет только на обработку Python, а не на столбцы базы данных. Другие могут высказать свое мнение, если сочтут это полезным; Люди, которые введены в заблуждение неправильным ответом, также могут подумать, что это было полезно.Как сказано в Django Model Field, ссылка: ссылка
источник
Важно понимать, что параметры в определении поля модели 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
реализовать простой вид мягкого удаления .источник
Возможно, у вас есть ответ, но до сегодняшнего дня трудно судить, следует ли указывать в поле значение null = True или пусто = True или оба. Лично я считаю, что предоставлять разработчикам так много вариантов - бесполезно и запутанно. Позвольте ручке нули или пробелы, как они хотят.
Я следую за этой таблицей из « Два совка Джанго» :
источник
Просто
null=True
определяет, что база данных должна приниматьNULL
значения, с другой стороны,blank=True
определяет при проверке формы, это поле должно принимать пустые значения или нет (Еслиblank=True
она принимает форму без значения в этом поле иblank=False
[значение по умолчанию] при проверке формы, она покажет Это поле обязательно для заполнения ошибка.null=True/False
связанный с базой данныхblank=True/False
связанные с проверкой формыисточник
Вот пример поля с
blank= True
иnull=True
description = models.TextField (пусто = True, null = True)
В этом случае::
blank = True
сообщает нашей форме, что можно оставить поле описания пустыма также
null = True
: сообщает нашей базе данных, что можно записать нулевое значение в поле db и не выдавать ошибку.источник
Означает, что для поля, подлежащего заполнению, нет ограничений базы данных, поэтому вы можете иметь объект с нулевым значением для заполненного поля, который имеет эту опцию.
Значит, нет никаких ограничений валидации в формах Django. поэтому, когда вы заполняете
modelForm
эту модель, вы можете оставить поле с этой опцией незаполненным.источник
Вот основное отличие
null=True
иblank=True
:Значением по умолчанию обоих
null
иblank
является False. Оба эти значения работают на уровне поля, т.е. хотим ли мы сохранить полеnull
илиblank
.null=True
установит значение поля,NULL
т.е. нет данных. Это в основном для значения столбца базы данных.blank=True
определяет, будет ли поле заполнено в формах. Это включает в себя администратора и ваши собственные пользовательские формы.title = models.CharField(blank=True) // title can be kept blank.
В базе данных("")
будут храниться.null=True
blank=True
Это означает, что поле является необязательным при любых обстоятельствах.источник
Значения по умолчанию null и blank являются False.
Null: это связано с базой данных. Определяет, будет ли данный столбец базы данных принимать нулевые значения или нет.
Пусто: это связано с проверкой. Он будет использоваться при проверке форм, при вызове form.is_valid ().
При этом совершенно нормально иметь поле с null = True и пустым = False. Значение на уровне базы данных может быть NULL, но на уровне приложения это обязательное поле.
Теперь, когда большинство разработчиков ошибаются: определение null = True для строковых полей, таких как CharField и TextField. Избегайте этого. В противном случае вы получите два возможных значения «без данных», а именно: « Нет» и пустую строку. Наличие двух возможных значений «нет данных» является избыточным. Соглашение Django - использовать пустую строку, а не NULL.
источник
Когда мы сохраняем что-либо в админке Django, происходит двухэтапная проверка, на уровне Django и на уровне базы данных. Мы не можем сохранить текст в числовом поле.
База данных имеет тип данных NULL, это ничего. Когда Django создает столбцы в базе данных, он указывает, что они не могут быть пустыми. И если вы попытаетесь сохранить NULL, вы получите ошибку базы данных.
Также на уровне Django-Admin все поля являются обязательными по умолчанию, вы не можете сохранить пустое поле, Django выдаст вам ошибку.
Итак, если вы хотите сохранить пустое поле, вам нужно разрешить его на уровне Django и базы данных. blank = True - разрешит пустое поле в админ-панели. null = True - позволит сохранить NULL в столбце базы данных.
источник
Там есть одна точка, где
null=True
было бы необходимо, даже дляCharField
или,TextField
и это когда в базе данных установленunique
флаг для столбца.Другими словами, если у вас есть уникальный Char / TextField в Django, вам нужно использовать это:
Для неуникальных CharField или TextField вам лучше не пропускать,
null=True
иначе некоторые поля будут установлены как NULL, а другие как "", и вам придется каждый раз проверять значение поля для NULL.источник
null - для базы данных, а пустое - для проверки полей, которые вы хотите отобразить в пользовательском интерфейсе, например в текстовом поле, чтобы получить фамилию человека. Если lastname = models.charfield (blank = true), он не просил пользователя ввести фамилию, поскольку это необязательное поле. Если lastname = models.charfield (null = true), то это означает, что если это поле не получает никакого значения от пользователя, оно будет храниться в базе данных в виде пустой строки "".
источник
Значение null = True и пусто = True в модели также зависит от того, как эти поля были определены в классе формы.
Предположим, вы определили следующий класс:
Если класс формы был определен так:
Тогда поле 'name' не будет обязательным (из-за пробела = True в модели), а поле 'address' будет обязательным (из-за пробела = False в модели).
Однако, если класс ClientForm был определен следующим образом:
Тогда оба поля («имя» и «адрес») будут обязательными, «поскольку поля, определенные декларативно, остаются как есть» ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) т. е. по умолчанию для атрибута 'required' поля формы установлено значение True, и для этого потребуется заполнить поля 'name' и 'address', даже если в модели для поля установлено значение blank = True.
источник
null - по умолчанию False, если True, Django будет хранить пустой как ноль в базе данных.
пусто - по умолчанию False, если true, это поле может быть пустым
больше, перейдите на https://docs.djangoproject.com/en/3.0/topics/db/models/
источник
Эта таблица ниже демонстрирует основные различия:
источник
Очень простыми словами ,
Пробел отличается от нуля.
нуль является чисто базой данных , связанными , в то время как заготовка проверки связанной (обязательно в форме) .
Если
null=True
Джанго будетstore empty values as NULL in the database
. Если поле имеетblank=True
, проверка формы будетallow entry of an empty value
. Если поле имеет пустое значение = False, поле будет обязательным.источник