Django 默认数据库

Sid*_*ant 4 django postgresql django-1.9 postgresql-9.5

因此,正如我最近了解到的,default我们在 Django 字段中指定的 仅仅是为了填充预先存在的行,并且在数据库级别上不充当“真正的”默认值。column_default这可以通过从数据库 shell查找来验证。

如果我理解正确的话,defaultPostgres 使用它在没有输入时输入值。如果是这样,那么我们应该无法在不提供默认值的情况下在 Django 中创建新对象,对吧?

对于前-

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    status = models.BooleanField(default=True) # new field added
Run Code Online (Sandbox Code Playgroud)

对于上述模型,default仅用于回填预先存在的行的新添加字段。它实际上并没有在数据库级别设置默认值。

 column_name | column_default                                     
-------------+----------------
 mymodel     | 
Run Code Online (Sandbox Code Playgroud)

但如果是这样,我不应该能够运行这个查询 -

MyModel.objects.create(name='test')
Run Code Online (Sandbox Code Playgroud)

因为没有“真正的”默认值。但我可以,但我不明白为什么。

谢谢你!

dan*_*era 6

引用文档:

\n
\n

创建新模型实例时使用默认值,并且未为该字段提供值\xe2\x80\x99t。当字段为主键时,字段设置为 None 时也使用默认值。

\n
\n

默认工作在应用程序级别,而不是数据库级别。我的意思是,当创建新模型实例(在内存中)时应用默认值,没有提供明确的值。

\n

Default未翻译为 ddl(数据库数据定义语言)asnot nulluniquedo。

\n

请注意,它default可能是一个值,也可能是创建新模型以提供值时调用的 django 函数。

\n

因此,默认字段值不会出现在数据库模式中。

\n

2023 年编辑

\n

使用新的db_default作为数据库计算的默认值(归功于@sytech,请参阅评论)

\n

  • 是的,这是 Django 中巨大的架构问题。 (2认同)