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

时间:2011-06-20 03:28:14

标签: django django-south

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

  1. ForeignKey字段与null=True添加到我的模型中,然后创建了schemamigration
  2. 创建一个datamigration,以便用合理的值填充该外键。应用此迁移后,我非常确定在该字段中没有剩余具有NULL值的对象。
  3. ForeignKey字段更改为null=False,然后再创建另一个schemamigration
  4. 但是,我在第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:
    

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

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

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

    我正在使用django-1.2south-0.7


    相关问题:Django South - turning a null=True field into a null=False field

    相关文档:Part 3: Advanced Commands and Data Migrations

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

1 个答案:

答案 0 :(得分:15)

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