Django:blank=True 和 default="" 之间的区别

Django: Difference between blank=True and default=""

声明模型时,有很多关于 nullblank 争论的问题(这个问题与此无关)!

但是如果我用 default="" 标记 django.db.models.CharFieldblank=True 有什么区别?

我觉得是同一个概念?

Field.null 如果 True,Django 将在数据库中将空值存储为 NULL。默认值为 False。 避免在 CharFieldTextField

中使用 null

Field.blank 如果 True,该字段允许为空。默认为 False.

注意: 这与 null 不同。 null 纯粹与数据库相关,其中 blank 是 validation-related.

空白参数和默认参数不可互换。最终的交互会有所不同,具体取决于您使用的组合。例如,

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

...将不允许您在未将数据输入 some_field 的情况下 保存模型实例 。在这种情况下,默认的空字符串只允许您在迁移时将该字段添加到模型中,因为您还不允许使用 null=True.

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

...将在没有数据的情况下保存,因为 blank=True。

另一种表达方式是您的 default='' 允许 non-nullable 字段存在,而 blank=True 允许您的 non-nullable 字段在没有数据输入的情况下保存()。如果您尝试迁移以下内容:

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: 

...因为没有默认值的 non-nullable 字段不能存在于数据库中,但是 blank=True 字段可以。注意,我在这里说的是 PostgeSQL。这可能适用于也可能不适用于 any/every 其他数据库。