我用南方来迁移我的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
约束,不会添加默认值。整型字段相同
如前所述,django中的默认机制是在model类中实现的,与south迁移无关。
另外,由于south 0.8,the ^{} flag is deprecated ,因此不会将默认值添加到模型中。
我要解决的是编写一个自定义迁移来添加默认值。可以通过创建单独的data migration来完成此操作:
并将以下行添加到
forwards
函数:或者,您可以修改原始迁移,而不是创建新迁移:
no_dry_run = True
添加到类本身(这样您就可以访问ORM)。orm.YourModel.objects.update(field_name = DEFAULT_VALUE)
添加到forwards
函数的末尾。这样就不必编写向后迁移,因为您已经有了原始的delete列1。
如果要使用以下方法自动生成迁移:
然后,在实际应用迁移之前,需要对迁移进行一次小的编辑。进入生成的迁移(应该称为
app_name/migrations/000X__auto_add_field_foo.py
)并查找参数:在
db.add_column
调用中。只需将此更改为:Django现在将把默认值应用于实际的模式,以及任何现有的行。如果South在默认情况下设置为
True
来生成这个参数,那就太好了,但是没有这样的运气。你每次都需要做这个编辑。在南方或其他地方,这不是虫子。
我认为您对Django中默认值的工作方式感到困惑。Django不在数据库架构中设置默认值。在创建新实例时,它直接在Python中应用它们。您可以通过执行
manage.py sqlall
来验证这一点,并查看生成的SQL不包含default
属性。相关问题 更多 >
编程相关推荐