Django南迁,不设德福

2024-05-13 19:49:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用南方来迁移我的django模型。然而在南方有一只讨厌的虫子。它不在Postgres数据库中设置默认值。示例:

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

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

有这个漏洞的补丁吗?

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


Tags: django模型数据库truedefault示例datetimemodels
3条回答

如前所述,django中的默认机制是在model类中实现的,与south迁移无关。

另外,由于south 0.8,the ^{} 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函数的末尾。

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

如果要使用以下方法自动生成迁移:

./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来生成这个参数,那就太好了,但是没有这样的运气。你每次都需要做这个编辑。

在南方或其他地方,这不是虫子。

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

相关问题 更多 >