диференціювати null = True, blank = True у django


901

Коли ми додаємо поле бази даних у 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?


8
У вас є хороші відповіді на питання про те , що тут: stackoverflow.com/questions/8159310 / ... і тут: stackoverflow.com/questions/4384098 / ...
juliomalegria


Так, у мене теж є цей корпус ForeignKeyіз blank=True, але без null=True. Коли модель збережена, я хочу автоматично "опублікувати" її, створивши з неї опублікований запис. Тому я не можу зберігати nullв базі даних, оскільки кожна модель повинна бути "опублікована", але я хочу мати можливість залишити поле порожнім в адміністраторі.
оса

Я думаю, що вас може зацікавити [Зберегти порожній, зведений CharField як нуль, а не як порожній рядок] ( code.djangoproject.com/ticket/4136 ). Про це існує багато дискусій, і може виникнути дуже практична проблема (наприклад, ви хочете додати відкритий URL для кожного користувача, який може бути нульовим і повинен бути унікальним).
ramwin

Відповіді:


1081

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

blankвизначає, чи потрібне буде поле у ​​формах. Сюди входять адміністратор та власні форми. Якщо blank=Trueтоді поле не буде обов'язковим, тоді як якщо це Falseполе, воно не може бути порожнім.

Комбінація цих двох є настільки частою, тому що зазвичай, якщо ви збираєтесь дозволити поле заповнити поле у ​​формі, вам також знадобиться ваша база даних, щоб дозволити NULLзначення для цього поля. Виняток становлять CharFields і TextFields, які в 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типи ніколи не зберігаються, як NULLDjango, тому null=Trueце зайве. Однак ви можете вручну встановити одне з цих полів, Noneщоб змусити його встановити як NULL. Якщо у вас є сценарій, де це може знадобитися, ви все одно повинні включити його null=True.


8
IntegrityErrorпіднімається, коли Джанго намагається зберегти запис у базі даних. Поле не потрібно заповнювати користувачем, і це проблема, оскільки на рівні бази даних це не нульове значення.
Кріс Пратт

5
Ні, Кріс намагається вказати, чому наявність порожнього = True, не маючи null = True, спричинить проблеми в DateTimeField.
Vinod Kurup

4
ПРИМІТКА для користувачів Oracle: Це неправда, що " CHARі TEXTНІКОЛИ не зберігаються, як NULLDjango". Це справедливо для більшості бекендів, але Oracle змусить порожній рядок до NULL, тому бекенд Django Oracle є винятком з вищезазначеного твердження Django Docs
stv

10
@ChrisPratt Незначне виправлення до вашої публікації: CharFields можуть бути збережені як NULL в базі даних (переклад на NonePython), якщо встановити null = True. В документи навіть сказати , щоб уникнути Пусте значення = True , оскільки вона дозволяє використовувати два різних види «blanky» цінностей. Я щойно перевірив цю поведінку за допомогою Django 1.8 / MySQL 5.6
Edward D'Souza

3
Поки ніхто не збирається відзначити поєднання: blank=True, null=False, default="something"?
Брайан Х.

124

Ось так карта blankта nullполя ORM для 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
)

41
Іншими словами, blankне впливає на базу даних і nullконтролює, чи дозволяють стовпці бази даних NULLзначення. Ця відповідь є дуже довгим способом сказати це, і не дає корисної інформації про blank.
Карл Мейєр

19
@CarlMeyer: Я хотів побачити, як це відображатиметься в базі даних і поділився, оскільки це заощадить час для інших. Теорія проти прикладу має значення, коли мова йде про засвоєння та прихильність до пам'яті. Насправді я пішов із шляху, щоб додати відображення для бази даних, яку я не використовував. Дякуємо за голосування. Кількість людей, які знайшли це корисним, очевидно, не згодні з вами.
користувач

5
Це може бути корисною відповіддю, якщо ви зробили якісь узагальнені висновки з представлених даних, але я не думаю, що подання необгрунтованого дамп-файлу є корисною відповіддю. У цьому випадку це фактично оманлива відповідь, оскільки (без подальших коментарів) це означає, що ефект обох blankі nullповинен бути відображений у стовпцях бази даних, коли насправді blankвпливає лише на обробку Python, а не на колонки бази даних. Інші можуть безкоштовно подати заявку, якщо вони вважають це корисним; також люди, яких оманливою відповіддю вводять в оману, вважають, що це корисно.
Карл Мейєр

4
Прийнята відповідь, якій майже 3 роки, пояснює все докладно. Тут немає сенсу повторювати ту саму інформацію.
користувач

48

Як сказано в посиланні на модель Django Model: Посилання

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

Наступні аргументи доступні для всіх типів полів. Усі необов’язкові.


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, поле буде обов'язковим.


46

Важливо розуміти, що параметри визначення поля моделі Джанго виконують (принаймні) дві цілі: визначення таблиць баз даних та визначення формату за замовчуванням та валідація форм моделей. (Я кажу "за замовчуванням", оскільки значення завжди можна змінити, надавши власну форму.) Деякі параметри впливають на базу даних, деякі параметри впливають на форми, а деякі впливають на обидва.

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

  • null=False, blank=False: Це конфігурація за замовчуванням і означає, що значення потрібно за будь-яких обставин.

  • null=True, blank=True: Це означає, що поле необов’язкове за будь-яких обставин. (Як зазначено нижче, однак це не рекомендований спосіб зробити поля на основі рядків необов'язковими.)

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

    • Найчастіше використовується для необов'язкових полів на основі рядків. Як зазначено в документації , ідіома Джанго полягає у використанні порожнього рядка для позначення відсутнього значення. Якщо NULLце також було дозволено, ви отримаєте два різні способи вказати пропущене значення.

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

    • Інше використання - це коли ви хочете вказати, що а ManyToManyFieldє необов’язковим. Оскільки це поле реалізоване як окрема таблиця, а не стовпець бази даних, nullбезглуздо . Значення blankволі все ж впливатиме на форми, проте контролюючи, чи вдасться перевірити, чи немає відносин.

  • null=True, blank=False: Це означає, що форма вимагає значення, але база даних не робить. Це може бути найчастіше використовувана конфігурація, але для неї є деякі випадки використання:

    • Цілком розумно вимагати від користувачів завжди включати значення, навіть якщо це насправді не вимагається вашою бізнес-логікою. Зрештою, форми є лише одним із способів додавання та редагування даних. У вас може бути код, який генерує дані, яким не потрібна така ж сувора перевірка, яку ви хочете вимагати від редактора людини.

    • Ще один випадок використання, який я бачив, - коли у вас є файл, ForeignKeyдля якого ви не бажаєте дозволити видалення каскаду . Тобто, у звичайному режимі відношення завжди має бути там ( blank=False), але якщо те, що воно вказує, трапляється видалити, ви також не хочете, щоб цей об’єкт видалявся. У такому випадку ви можете використовувати null=Trueта on_delete=models.SET_NULLреалізувати простий вид м'якого видалення .


1
Це ідеальна відповідь, усі можливі комбінації пояснюються дуже стисло!
РусьІ

1
Повинна бути прийнята відповідь.
Том Мак

28

У вас може бути відповідь, проте до цього дня важко судити про те, чи потрібно вводити в поле null = True або blank = True або обидва. Особисто я вважаю, що надавати розробникам так багато варіантів і заплутано. Нехай обробляє нулі або заготовки, як вони хочуть.

Я слідую за цією таблицею з " Дві ложки Джанго" :введіть тут опис зображення

Таблиця, що показує, коли слід використовувати нульовий чи порожній для кожного типу поля


26

Просто null=Trueвизначає, база даних повинна приймати NULLзначення, з іншого боку blank=Trueвизначає при валідації форми, це поле має приймати порожні значення чи ні (Якщо blank=Trueвін приймає форму без значення в цьому полі та blank=False[значення за замовчуванням] під час перевірки форми, воно покаже Це поле потрібно помилки.

null=True/False пов'язані з базою даних

blank=True/False пов'язані з валідацією форми


11

Ось приклад поля з blank= Trueіnull=True

description = models.TextField (blank = True, null = True)

У цьому випадку:: blank = Trueповідомляє нашій формі, що нормально залишити поле опису порожнім

і

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


7

Тут основна відмінність null=Trueта blank=True:

Значення за замовчуванням обох nullта blankFalse. Обидва ці значення працюють на польовому рівні , тобто, чи хочемо ми , щоб зберегти поле 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

6
null = True

Значить немає обмеження бази даних для заповненого поля, тому ви можете мати об'єкт із нульовим значенням для заповненого, який має цю опцію.

blank = True

Значить немає обмежень у валідації у формах джанго. тож коли ви заповнюєте modelFormцю модель, ви можете залишити поле з цією опцією не заповненим .


6

Значення за замовчуванням null and blank є False.

Null: Це пов'язано з базою даних. Визначає, чи прийме заданий стовпець бази даних нульові значення чи ні.

Бланк: Це стосується перевірки. Він буде використовуватися під час перевірки форм при виклику form.is_valid ().

Коли це сказано, цілком чудово мати поле з null = True та blank = False. Значення на рівні бази даних поле може бути NULL, але на рівні програми це обов'язкове поле.

Тепер, де більшість розробників помиляються: Визначення null = True для полів на основі рядків, таких як CharField та TextField. Уникайте цього робити. В іншому випадку у вас з'явиться два можливих значення для "немає даних", тобто: None і порожній рядок. Наявність двох можливих значень для "немає даних" є зайвим. Конвенція Джанго полягає у використанні порожнього рядка, а не NULL.


5

Коли ми зберігаємо що-небудь в адміністраторі Джанго, відбувається перевірка двох кроків, на рівні Джанго та на рівні Бази даних. Ми не можемо зберегти текст у полі числа.

База даних має тип даних NULL, це нічого. Коли Django створює стовпці в базі даних, він вказує, що вони не можуть бути порожніми. І якщо ви спробуєте зберегти NULL, ви отримаєте помилку в базі даних.

Також на рівні Django-Admin всі поля обов'язкові для заповнення, ви не можете зберегти порожнє поле, Django видасть вам помилку.

Отже, якщо ви хочете зберегти порожнє поле, вам потрібно дозволити його на рівні Django та Database. blank = True - дозволить пусте поле на панелі адміністратора null = True - дозволить зберегти NULL у стовпці бази даних.


5

Є одна точка, де null=Trueбуло б потрібно навіть на CharFieldабо, TextFieldі це коли база даних містить uniqueпрапор для стовпця.

Іншими словами, якщо у вас є унікальний Char / TextField у Django, вам потрібно буде скористатися цим:

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

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


3

null призначений для бази даних, а blank - для перевірки полів, які ви хочете показати в інтерфейсі користувача, як textfield, щоб отримати прізвище людини. Якщо lastname = models.charfield (blank = true), він не вимагає від користувача ввести прізвище, оскільки це зараз необов'язкове поле. Якщо lastname = models.charfield (null = true), це означає, що якщо це поле не отримує від користувача жодного значення, воно зберігатиметься в базі даних як порожній рядок "".


1

Значення null = True та blank = True у моделі також залежить від того, як ці поля були визначені у класі форми.

Припустимо, ви визначили такий клас:

class Client (models.Model):
    name = models.CharField (max_length=100, blank=True)
    address = models.CharField (max_length=100, blank=False)

Якщо клас форми визначено так:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']
        widgets = {
            'name': forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
            'address': forms.TextInput (attrs = {'class': 'form-control form-control-sm'})
        }

Тоді поле 'ім'я' не буде обов’язковим (через пробіл = Істинно в моделі), а поле 'адреса' буде обов'язковим (через порожнє = Неправильне в моделі).

Однак якщо клас ClientForm визначено так:

class ClientForm (ModelForm):
    class Meta:
        model = Client
        fields = ['name', 'address']

    name = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )
    address = forms.CharField (
        widget = forms.TextInput (attrs = {'class': 'form-control form-control-sm'}),
    )

Тоді обидва поля ("ім'я" та "адреса") будуть обов'язковими, "оскільки поля, визначені декларативно, залишаються як є" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) , тобто за замовчуванням для атрибута "обов'язковий" поля форми є True, і для цього потрібно буде заповнити поля "name" та "address", навіть якщо в моделі для поля було встановлено значення blank = True.


0

null - за замовчуванням False, якщо True, Django зберігатиме порожній як null у базі даних.

blank - за замовчуванням False, якщо вірно, що поле дозволено бути порожнім

докладніше, перейдіть на сторінку https://docs.djangoproject.com/en/3.0/topics/db/models/


0

Ця таблиця нижче демонструє основні відмінності:

+--------------------------------------------------------------------+
| Purpose                  | null=True        | blank = True         |
|--------------------------|------------------|----------------------|
| Field can be empty in DB | Do this          | Unaffected           |
|--------------------------|------------------|----------------------|
| ModelForm(required field)| Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| Form Validation          | Unaffected       | field not required   |
|--------------------------|------------------|----------------------|
| on_delete=SET_NULL       | Need this        | Unaffected           |
+--------------------------------------------------------------------+

0

Дуже простими словами ,

Пустий відрізняється від нуля.

нуль є чисто базою даних , пов'язаними , в той час як заготівля перевірки пов'язаної (обов'язково в формі) .

Якщо null=True, Джанго буде store empty values as NULL in the database. Якщо поле є blank=True, перевірка форми буде allow entry of an empty value. Якщо поле має порожнє = Неправильне, поле буде обов'язковим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.