0

我看到当您添加列并想要创建架构迁移时,该字段必须具有 null=True 或 default=something。

我没有得到的是,我最初在模型中编写的许多字段(例如,在初始 schemamigration --init 或从 convert_to_south 应用程序之前,我都做了)没有针对此检查运行,因为我没有'没有空/默认错误。

正常吗?

为什么会这样?为什么 South 仍然检查这个空/默认的东西?

4

2 回答 2

1

如果您将一列添加到已经填充了一些行的表中,那么:

  • 该列可以为空,并且现有行只需为该列获取一个空值
  • 该列不可为空,但具有默认值,并且现有行已更新为具有该列的默认值

要生成没有默认值的不可为空的列,您需要分多个步骤添加该列。任何一个:

  • 将该列添加为可为空,手动填充默认值,然后将该列标记为不可为空
  • 添加具有默认值的列,然后删除默认值

这些实际上是相同的,它们都将通过更新每一行。

我不知道 South,但是根据您的描述,它旨在生成单个 DDL 语句来添加列,并且没有能力像这样在多个步骤中添加它。也许您可以覆盖该行为,或者您可以使用两个迁移?

相比之下,在创建表时,显然没有现有数据,因此您可以自由地创建不带默认值的不可为空的列。

于 2012-10-26T11:09:42.463 回答
0

当您的数据库中有现有记录并在其中一个表中添加一列时,您必须告诉数据库在其中放入什么,南方无法读懂您的想法:-)

因此,除非您将新字段标记为 null=True 或选择默认值,否则它将引发错误。如果您有一个空数据库,则无需设置任何值,但模型字段仍需要基本属性。如果您深入了解您正在使用的字段类,您会看到 django 设置了一些默认值,例如 max_length 和 null(取决于字段)。

于 2012-10-26T11:10:01.900 回答