South在Python/Django中忽略字段默认值的变化

13 投票
1 回答
2832 浏览
提问于 2025-04-16 17:46

为什么South不识别Python模型中默认字段值的变化呢?举个例子,假设我们有一个已经用South迁移过的模型:

class MyFamily(models.Model):
    family_size = models.IntegerField(verbose_name="What is your family size?", default=2)

现在,我想把默认值从2改成4。但是,当我进行模式迁移时,South却报告:

python manage.py schemamigration family --auto change_default_from_two_to_four_for_size

Running migrations for family:
- Nothing to migrate.
    - Loading initial data for family.

我可以手动更新初始迁移,并用SQL直接更新这个字段,但这样做太麻烦了。有没有我没找到的South命令,可以识别默认值的变化呢?

谢谢!

1 个回答

11

South 不会更新已有列的默认值,因为这对他来说只在向一个非空表添加新列时才重要。django orm 会在将新行写入数据库之前,处理将新的默认值写入这些新行。

如果你要从 django orm 之外操作数据库,就需要手动更新它。

更多解释可以查看 south/db.add_column

撰写回答