South:为一个既唯一又非空的列运行迁移

16 投票
1 回答
2218 浏览
提问于 2025-04-17 00:30

在使用South/Django的时候,我遇到了一个问题。我想给一个已经有数据的模型添加一个 UNIQUE(唯一)和 NOT NULL(不能为空)的字段。因为这个字段是 NOT NULL,所以South要求我为这个字段指定一个默认值。但是,由于这个字段还要满足 UNIQUE 的要求,我不能在models.py里给这个字段设置默认值,也不能指定一个一次性的值,因为那样的话,所有的行都会是同样的值。

我想到的解决办法是,先创建一个可以为空的字段,先应用这个迁移,然后运行一个脚本给现有的行填充唯一的值,最后再添加一个迁移,把 UNIQUE 的约束加到这个字段上。

但是有没有更好的方法来实现同样的目标呢?

1 个回答

13

是的,这就是你应该采取的方法。你应该先进行模式迁移(schemamigration),然后是数据迁移(datamigration),最后再进行一次模式迁移。可惜的是,如果在SQL中没有办法做到这一点,那么south也无法做到。

撰写回答