因此,正如我最近了解到的,我们在 Django 字段中指定的
default
只是为了填充预先存在的行,并且在数据库级别并不充当“真正的”默认值。这可以通过从数据库 shell 查找 column_default
来验证。
如果我理解正确的话,Postgres 使用
default
在没有输入的情况下输入值。如果是这样,那么我们应该无法在不提供默认值的情况下在 Django 中创建新对象,对吧?
对于前任 -
class MyModel(models.Model):
name = models.CharField(max_length=255)
status = models.BooleanField(default=True) # new field added
对于上述模型,
default
仅用于回填预先存在的行的新添加字段。它实际上并没有在数据库级别设置默认值。
column_name | column_default
-------------+----------------
mymodel |
但如果是这样,我应该无法运行此查询 -
MyModel.objects.create(name='test')
因为没有“真正的”默认值。但我可以,但我不明白为什么。
谢谢!
引用文档:
当创建新模型实例并且未为该字段提供值时,将使用默认值。当字段为主键时,字段设置为 None 时也使用默认值。
默认工作在应用程序级别,而不是数据库级别。我的意思是,当创建新模型实例(在内存中)时应用默认值,没有提供明确的值。
Default
未像 not null
或 unique
那样翻译为 ddl(数据库数据定义语言)。
注意
default
可能是一个值,也可能是创建新模型时调用的 django 函数以提供值。
因此,默认字段值不会出现在数据库架构中。
2023 年编辑
使用新的 db_default 作为数据库计算的默认值(归功于 @sytech,请参阅评论)