【问题标题】:Django default at databaseDjango默认在数据库
【发布时间】:2018-12-10 12:55:16
【问题描述】:

所以我最近了解到,我们在 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')

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

谢谢!

【问题讨论】:

    标签: django postgresql postgresql-9.5 django-1.9


    【解决方案1】:

    引用文档:

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

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

    Default 不会像 not nullunique 那样翻译成 ddl(数据库数据定义语言)。

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

    因为所有这些,默认字段值不会出现在数据库架构中。

    【讨论】:

    • 是的,这是 Django 中巨大的架构问题。
    • 这很奇怪。知道他们为什么这样做吗?
    • @SohamDongargaonkar,因为将随机 python 代码转换为任何品牌的数据库代码(t-sql,pl-sql,...)并非易事
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 2015-06-29
    • 2017-06-12
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多