我想在我的模型中添加ForeignKey
字段。为了实现这一目标,我做了3个步骤:
ForeignKey
字段与null=True
添加到我的模型中,然后创建了schemamigration
。datamigration
,以便用合理的值填充该外键。应用此迁移后,我非常确定在该字段中没有剩余具有NULL值的对象。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:
嗯...没有默认值对这个字段有意义,而且现在我很确定没有对象将该字段设为NULL。所以... 我不知道如何正确回答这个问题。如果可以,我会说“不设置任何默认值,如果你发现任何NULL,则抛出错误列”。
目前,作为解决该问题的解决方法,我选择了2
选项,然后使用1
作为一次性默认值。这是一个非常糟糕的解决方案,但至少south
不抱怨它并创建迁移。
NOT NULL
的正确方法是什么? (使用south
)south
要求我提供不应该有字段的字段的默认值时,我该怎么办?我正在使用django-1.2
和south-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”,但我没有足够的声誉来建议同义词)
答案 0 :(得分:15)
只是一个想法:由于这是一个外键,您可以将默认值设置为您知道永远不会有引用记录的记录,即0或-1。如果南方实际上会尝试使用此默认值,则您的数据库将引发错误。