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. Это может относиться или не относиться к любой другой СУБД.