django南迁,没有设置默认值

jer*_*use 10 python django django-south

我用南方来迁移我的django模型.然而,南方有一个令人讨厌的虫子.它没有在Postgres数据库中设置默认值.例:

created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)
Run Code Online (Sandbox Code Playgroud)

South会将这两个字段添加到数据库中,但无法设置其默认值,这需要手动完成.

这个bug有没有补丁?

更新 我已经尝试过设置默认日期auto_now_add=True,但这也没有设置默认值.添加null=True字段会添加db.alter_column由南方生成的迁移脚本.但是这只会删除NOT NULL约束,不添加默认值.整数字段相同

gal*_*ant 22

如果您使用以下命令自动生成迁移:

./manage.py schemamigration app_name --auto
Run Code Online (Sandbox Code Playgroud)

然后,您需要在实际应用之前对迁移进行小的编辑.进入生成的迁移(应该称为类似app_name/migrations/000X__auto_add_field_foo.py)并查找参数:

keep_default=False
Run Code Online (Sandbox Code Playgroud)

在db.add_column调用中.只需将其更改为:

keep_default=True
Run Code Online (Sandbox Code Playgroud)

除了任何现有的行之外,Django现在将默认值应用于实际模式.如果南方有某种设置来默认生成此参数为True,那将会很棒,但没有这样的运气.您需要每次都进行此编辑.

  • +1.不幸的是[`keep_default`在南0.8.1被弃用](http://south.readthedocs.org/en/latest/releasenotes/0.8.1.html#keep-default-fully-deprecated) (5认同)

Dan*_*man 12

这不是南方或其他地方的错误.

我认为你对Django默认值的工作原理感到困惑.Django不在数据库模式中设置默认值.它在创建新实例时直接在Python中应用它们.您可以通过执行此操作来验证这一点,manage.py sqlall并查看生成的SQL不包含default属性.

  • 您必须使用自定义SQL自行修改架构.您可以通过将SQL传递给[`db.execute`](http://south.aeracode.org/docs/databaseapi.html#db-execute)在South中执行此操作. (5认同)
  • Daniel只是因为Django试图阻止用户在架构级别更改字段默认值,这并不意味着他们应该无法做到.我在下面发布了一个实际解决方案. (3认同)
  • 如何在Postgres数据库中强制执行默认值.我有apis直接与django创建的数据库协商.他们希望默认设置到位. (2认同)
  • 当你向模型中添加一些非空的非空字段时,这很奇怪,指定默认值,南方不会将它用于现有行.看起来南方允许违反限制. (2认同)