首页 文章

django南迁,没有设置默认值

提问于
浏览
8

我用南方来迁移我的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 回答

  • 11

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

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

  • 2

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

    ./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,那将会很棒,但没有这样的运气 . 您需要每次都进行此编辑 .

  • 21

    如前面的答案所述,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 函数的末尾 .

    这样您就不必编写向后迁移,因为您已经拥有原始的delete-column .

相关问题