null=True
устанавливает NULL
(по сравнению с NOT NULL
) в столбце вашей БД. Пустые значения для типов полей Django, таких как DateTimeField
или ForeignKey
, будут сохранены как NULL
в базе данных.
blank
определяет, будет ли это поле обязательным в формах. Это включает в себя администратора и ваши пользовательские формы. Если 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
никогда не сохраняются Django как NULL
, поэтому null=True
не требуется. Однако вы можете вручную установить для одного из этих полей значение None
, чтобы принудительно установить его как NULL
. Если у вас есть сценарий, в котором это может быть необходимо, вы все равно должны включить null=True
.
У вас есть хорошие ответы по этому поводу здесь: coderhelper.com/questions/8159310/… и здесь: coderhelper.com/questions/4384098/…
Приятного чтения: b-list.org/weblog/2006/jun/28/…
Да, у меня также есть этот вариант использования с
ForeignKey
сblank=True
, но безnull=True
. Когда модель сохранена, я хочу автоматически "опубликовать" ее, создав из нее опубликованную запись. Поэтому я не могу сохранитьnull
в базе данных, поскольку каждая модель должна быть «опубликована», но я хочу иметь возможность оставить поле пустым в админке.Я думаю, вас может заинтересовать [Сохранить пустое поле CharField, допускающее значение null, а не как пустую строку] (code.djangoproject.com/ticket/4136). По этому поводу ведется много дискуссий, и вы можете столкнуться с очень практической проблемой (например, вы хотите добавить URL-адрес openid для каждого пользователя, который может быть нулевым и должен быть уникальным).
Избегайте использования null в строковых полях, таких как CharField и TextField. docs.djangoproject.com/en/3.1/ref/models/fields