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