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


1. blank=True

Опция blank=True определяет, можно ли оставить поле пустым на этапе валидации формы. Это в основном связано с формами Django.

  • Значение: поле может быть пустым, и ошибка валидации формы не возникнет.
  • Сцена использования: используется, когда вы хотите позволить, чтобы поле было пустым при вводе данных пользователем. Например, если в профиле пользователя определенное поле необязательно и его не нужно заполнять, то используется blank=True.
from django.db import models

class Profile(models.Model):
    bio = models.TextField(blank=True)  # Поле для самоописания, не обязательное для заполнения

2. null=True

Опция null=True позволяет значению поля быть NULL в базе данных. То есть, она определяет, разрешено ли пустое значение на уровне базы данных.

  • Значение: поле может иметь значение NULL в базе данных.
  • Сцена использования: используется, когда следует обрабатывать ситуации, в которых в базе данных сохраняется пустое значение. Если поле не является строковым, то, не указав null=True, Django будет сохранять значение по умолчанию вместо пустого значения. Например, если вы хотите обработать отсутствие значения для полей даты или чисел как NULL, вам нужно установить null=True.
from django.db import models

class Event(models.Model):
    end_date = models.DateTimeField(null=True)  # Поле, позволяющее событиям без даты окончания

3. Различия между blank=True и null=True

Основное различие между двумя опциями связано с валидацией форм и способом сохранения в базе данных.

Опция Описание функции Цель использования
blank=True Поле может быть пустым при валидации формы Не требуется обязательный ввод от пользователя
null=True Разрешить значение NULL в базе данных Позволить оставлять поле пустым в базе данных

В Django blank=True позволяет полю быть пустым на уровне формы, в то время как null=True разрешает пустое значение на уровне базы данных.


4. Когда использовать обе опции вместе?

Обычно в строковых полях (CharField, TextField и т. д.) устанавливается только blank=True, а null=True не используется. В Django пустая строка ('') и значение NULL обрабатываются отдельно, поэтому пустая строка обычно рассматривается как пустое значение вместо NULL.

С другой стороны, для нестроковых полей (например, DateTimeField, IntegerField), если поле не обязательно, рекомендуется использовать вместе blank=True и null=True. Это позволит оставить значение пустым в форме и сохранить значение NULL в базе данных.

class Task(models.Model):
    name = models.CharField(max_length=200, blank=True)   # Только blank=True для строкового поля
    due_date = models.DateTimeField(blank=True, null=True) # Оба blank=True и null=True для поля даты

5. Резюме и заключение

  • blank=True: позволяет полю быть пустым в форме без возникновения ошибок. Обычно используется, когда ввод от пользователя не обязателен.
  • null=True: позволяет полю иметь значение NULL в базе данных. Используется для нестроковых полей.
  • Совместное использование: используется blank=True и null=True для нестроковых полей, когда значение может быть оставлено пустым.

Правильное использование этих двух опций при проектировании моделей Django помогает повысить гибкость структуры базы данных и ввода данных пользователем.

В следующем посте мы рассмотрим опцию поля related_name, которая часто используется при настройке ForeignKey. Это также довольно полезная опция в ORM, поэтому надеемся, что вы также уделите внимание следующему посту.