我看到当您添加列并想要创建架构迁移时,该字段必须具有 null=True 或 default=something。
我没有得到的是,我最初在模型中编写的许多字段(例如,在初始 schemamigration --init 或从 convert_to_south 应用程序之前,我都做了)没有针对此检查运行,因为我没有'没有空/默认错误。
正常吗?
为什么会这样?为什么 South 仍然检查这个空/默认的东西?
我看到当您添加列并想要创建架构迁移时,该字段必须具有 null=True 或 default=something。
我没有得到的是,我最初在模型中编写的许多字段(例如,在初始 schemamigration --init 或从 convert_to_south 应用程序之前,我都做了)没有针对此检查运行,因为我没有'没有空/默认错误。
正常吗?
为什么会这样?为什么 South 仍然检查这个空/默认的东西?
如果您将一列添加到已经填充了一些行的表中,那么:
要生成没有默认值的不可为空的列,您需要分多个步骤添加该列。任何一个:
这些实际上是相同的,它们都将通过更新每一行。
我不知道 South,但是根据您的描述,它旨在生成单个 DDL 语句来添加列,并且没有能力像这样在多个步骤中添加它。也许您可以覆盖该行为,或者您可以使用两个迁移?
相比之下,在创建表时,显然没有现有数据,因此您可以自由地创建不带默认值的不可为空的列。
当您的数据库中有现有记录并在其中一个表中添加一列时,您必须告诉数据库在其中放入什么,南方无法读懂您的想法:-)
因此,除非您将新字段标记为 null=True 或选择默认值,否则它将引发错误。如果您有一个空数据库,则无需设置任何值,但模型字段仍需要基本属性。如果您深入了解您正在使用的字段类,您会看到 django 设置了一些默认值,例如 max_length 和 null(取决于字段)。