django南迁,没有设置默认值

时间:2012-04-03 10:48:30

标签: python django django-south

我用南方来迁移我的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 约束,不会添加默认值。整数字段相同

3 个答案:

答案 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)

或者,您可以修改原始迁移,而不是创建新迁移:

  1. no_dry_run = True添加到类本身(这样您就可以访问ORM了。)
  2. orm.YourModel.objects.update(field_name = DEFAULT_VALUE)添加到forwards功能的末尾。
  3. 这样您就不必编写向后迁移,因为您已经拥有原始的删除列。