Django: Разница между blank=True и default=""

При объявлении модели возникает много вопросов о null vs blank аргументах.

Но в чем разница между тем, если я помечаю django.db.models.CharField с помощью default="" и blank=True ?

Мне кажется, что это одна и та же концепция?

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

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

ПРИМЕЧАНИЕ: Это отличается от null. null связан исключительно с базой данных, в то время как blank связан с валидацией.

Пустые аргументы и аргументы по умолчанию не являются взаимозаменяемыми. Результирующее взаимодействие будет различным, в зависимости от того, какую комбинацию вы используете. Например,

some_field = models.CharField(default='', max_length=20)

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

some_field = models.CharField(blank=True, default='', max_length=20)

...сохранит без данных, так как blank=True.

Другой способ выразить это в том, что ваш default='' позволяет существовать ненулевому полю, а blank=True позволяет вашему ненулевому полю сохранять() без ввода данных. Если вы попытаетесь перенести следующее:

some_field = models.CharField(max_length=20)

...вы получите следующую ошибку:

You are trying to add a non-nullable field 'some_string' to YourModelName without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 

... поскольку не нулевое поле без значения по умолчанию не может существовать в базе данных, а поле blank=True может. Обратите внимание, я говорю здесь о PostgeSQL. Это может относиться или не относиться к любой другой СУБД.

Вернуться на верх