【问题标题】:django south migration, doesnt set defaultdjango南迁移,没有设置默认值
【发布时间】:2012-04-17 00:21:59
【问题描述】:

我使用南来迁移我的 django 模型。然而,南方有一个令人讨厌的错误。它不会在 Postgres 数据库中设置默认值。示例:

created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)

South会将这2个字段添加到数据库中,但无法设置它们的默认值,需要手动完成。

这个bug有补丁吗?

更新 我已经尝试使用auto_now_add=True 设置默认日期,但这也不是设置默认值。在字段中添加null=True 会在South 生成的迁移脚本中添加db.alter_column。但这只是 删除 NOT NULL 约束,不会添加默认值。整数字段也一样

【问题讨论】:

    标签: python django django-south


    【解决方案1】:

    这不是错误,在南方或其他地方。

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

    【讨论】:

    • 如何在 Postgres 数据库中强制执行默认设置。我有直接与 django 创建的数据库协商的 api。他们希望默认设置到位。
    • 您必须使用自定义 SQL 自己修改架构。您可以通过将 SQL 传递给 db.execute 在 South 中执行此操作。
    • Daniel 仅仅因为 Django 试图阻止用户在模式级别更改字段默认值,这并不意味着他们应该不能这样做。我在下面发布了一个实际的解决方案。
    • 当您向模型添加一些非空白非空字段,指定默认值并且南不对现有行使用它时,这很奇怪。看起来 South 允许违反约束。
    【解决方案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 现在会将您的默认值应用于实际架构。如果 South 有某种设置来默认将此参数生成为True,那就太好了,但没有这样的运气。您每次都需要进行此编辑。

    【讨论】:

    【解决方案3】:

    前面的回答中提到,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 函数的末尾。

    这样您就不必编写向后迁移,因为您已经有了原始的删除列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2018-11-23
      • 2018-08-19
      • 2023-03-22
      • 2019-07-27
      • 2014-06-22
      • 2014-12-21
      • 2011-04-03
      相关资源
      最近更新 更多