null=True и blank=True со строковыми полями
Анти-паттерн
При работе с любыми строковыми полями в Django, важно понимать различие между параметрами null и blank.
null=True означает, что в БД для данного поля может храниться значение NULL.
blank=True отвечает за валидацию на уровне форм: поле может быть оставлено пустым при вводе данных.
Пример¶
Для строковых полей рекомендуется использовать blank=True, но не null=True, потому что в БД принято хранить «пустое» значение для строк как пустую строку '', а не как NULL. Установка null=True создаёт двусмысленность: отсутствие данных может быть представлено, в таком случае, и как NULL, и как пустая строка.
Плохо:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
summary = models.TextField(null=True, blank=True, default="")
url = models.URLField(null=True, blank=True, default="")
def __str__(self):
return self.title
Хорошо:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
summary = models.TextField(blank=True, default="")
url = models.URLField(blank=True, default="")
def __str__(self):
return self.title