我用南方来迁移我的django模型 . 然而,南方有一个令人讨厌的虫子 . 它没有在Postgres数据库中设置默认值 . 例:
created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)
South会将这两个字段添加到数据库中,但无法设置其默认值,这需要手动完成 .
这个bug有没有补丁?
UPDATE 我已经尝试使用 auto_now_add=True
设置默认日期,但这也不是设置默认值 . 在字段中添加 null=True
会在南方生成的迁移脚本中添加 db.alter_column
. 但是这只会删除 NOT NULL
约束,不会添加默认值 . 整数字段相同
3 回答
这不是南方或其他地方的错误 .
我认为你对Django默认值的工作原理感到困惑 . Django不在数据库模式中设置默认值 . 它在创建新实例时直接在Python中应用它们 . 您可以通过执行
manage.py sqlall
来验证这一点,并查看生成的SQL不包含default
属性 .如果您使用以下命令自动生成迁移:
然后,您需要在实际应用之前对迁移进行小的编辑 . 进入生成的迁移(应该称为类似app_name / migrations / 000X__auto_add_field_foo.py)并查找参数:
在db.add_column调用中 . 只需将其更改为:
除了任何现有的行之外,Django现在将默认值应用于实际模式 . 如果南方有某种设置来默认生成此参数为True,那将会很棒,但没有这样的运气 . 您需要每次都进行此编辑 .
如前面的答案所述,django中的默认机制是在模型类中实现的,与南迁移无关 .
此外,由于南0.8,the keep_default flag is deprecated,并且不会为您的模型添加默认值 .
我要做的就是编写自定义迁移来添加默认值 . 您可以通过创建单独的data migration来实现:
并将以下行添加到
forwards
函数:或者,您可以修改原始迁移,而不是创建新迁移:
将
no_dry_run = True
添加到类本身(这样您就可以访问ORM了) .将
orm.YourModel.objects.update(field_name = DEFAULT_VALUE)
添加到forwards
函数的末尾 .这样您就不必编写向后迁移,因为您已经拥有原始的delete-column .