在模式迁移中,null = False字段的默认值应该是什么,我确定它不会有空值?

Den*_*aia 17 django django-south

我想在ForeignKey我的模型中添加一个字段.为了实现这一点,我做了3个步骤:

  1. 在我的模型中添加了ForeignKey字段null=True,然后创建了一个schemamigration.
  2. 创建一个datamigration以便用合理的价值填充该外键.应用此迁移后,我非常确定在该字段中没有留下NULL值的对象.
  3. 将该ForeignKey字段更改为null=False,然后创建另一个schemamigration.

但是,我在第3步遇到了问题:

? The field 'MyModel.fkfield' does not have a default specified, yet is NOT NULL.
? Since you are making this field non-nullable, you MUST specify a default
? value to use for existing rows. Would you like to:
?  1. Quit now, and add a default to the field in models.py
?  2. Specify a one-off value to use for existing columns now
? Please select a choice:
Run Code Online (Sandbox Code Playgroud)

嗯...没有默认值对这个字段有意义,而且现在我很确定没有对象将该字段设为NULL.所以... 我不知道如何正确回答这个问题.如果可以,我会说"不设置任何默认值,如果在该列中发现任何NULL,则抛出错误".

就目前而言,作为解决该问题的解决方法,我选择了选项2,然后将其1用作一次性默认值.这是一个非常糟糕的解决方案,但至少south不会抱怨它并创建迁移.

  • 将字段更改为的正确方法是NOT NULL什么?(使用south)
  • south我要求一个不应该有一个字段的默认值时,我该怎么办?

我正在使用django-1.2south-0.7.


相关问题:Django South - 将null = True字段转换为null = False字段

相关文档:第3部分:高级命令和数据迁移

(脚注:在StackOverflow,我们有两个看起来相同的标签:"django-south"和"south",但我没有足够的声誉来建议同义词)

Udi*_*Udi 15

只是一个想法:由于这是一个外键,您可以将默认值设置为您知道永远不会有引用记录的记录,即0或-1.如果south实际上尝试使用此默认值,则您的数据库将引发错误.

  • @ChrisPratt这在理论上很好,但是当一个表现良好的应用程序正在访问数据库时会发生什么? (7认同)