南部初始迁移不是强制拥有默认值?

时间:2012-10-26 11:00:15

标签: python django postgresql django-south

我看到当你添加一个列并想要创建一个schemamigration时,该字段必须有null = True或default = something。

我没有得到的是我最初在模型中编写的许多字段(例如,在最初的模式移植之前 - 或者来自convert_to_south应用程序,我同时执行了两个操作)都没有针对此检查运行,因为我没有null / default错误。

这是正常的吗?

为什么会这样?为什么南方检查这个null /默认的东西呢?

2 个答案:

答案 0 :(得分:1)

如果您向已填充了某些行的表添加列,则可以:

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

要生成不具有默认值的非可空列,您需要以多个步骤添加列。之一:

  • 将列添加为可为空,手动填充默认值,然后将列标记为不可为空
  • 使用默认值添加列,然后删除默认值

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

我不知道South,但是根据您所描述的内容,它的目标是生成一个DDL语句来添加列,并且无法像这样在多个步骤中添加它。也许你可以覆盖这种行为,或者你可以使用两次迁移?

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

答案 1 :(得分:0)

如果您的数据库中有现有记录并且您在其中一个表中添加了一列,则必须告诉数据库要放在哪里,南方无法读懂您的想法: - )

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