数据库中默认值的Django实现
Posted
技术标签:
【中文标题】数据库中默认值的Django实现【英文标题】:Django implementation of default value in database 【发布时间】:2017-09-13 09:27:02 【问题描述】:我在模型上有一个字段是:
class SomeModel(models.Model):
some_field = models.CharField(max_length=10, null=True, blank=True)
然后我将模型更改为:
class SomeModel(models.Model):
some_field = models.CharField(max_length=10, default='')
当我运行 django-admin sqlmigrate somemodels somemigration
来检查我的迁移时,我发现了以下变化:
ALTER TABLE "somemodels" ALTER COLUMN "some_field" SET DEFAULT '';
UPDATE "somemodels" SET "some_field" = '' WHERE "some_field" IS NULL;
ALTER TABLE "somemodels" ALTER COLUMN "some_field" SET NOT NULL;
ALTER TABLE "somemodels" ALTER COLUMN "some_field" DROP DEFAULT;
我不明白为什么 Django 在表中应用DROP DEFAULT
,因为我正在创建一个默认值。如果正确,Django 是如何实现默认值的?
关于我的工具的信息:
Postgresql 9.5; Django 1.11b1;【问题讨论】:
【参考方案1】:cmets 到django/db/backends/base/schema.py,开始 ln。 571,详细说明这里涉及的步骤:
当使用给定的默认值将列 NULL 约束更改为 NOT NULL 时,我们需要执行 4 个步骤:
为新传入的写入添加默认值 使用新的默认值更新现有的 NULL 行 用 NOT NULL 替换 NULL 约束 再次删除默认设置。
Django 通常不使用内置的 SQL 默认值来设置值(请记住,Django 可以使用可调用值作为默认值)。您可以在此rejected bug report 中找到更多信息。
【讨论】:
非常感谢!在您发布的错误报告中,有人仍然说“Django 使用数据库默认值来设置表中现有行的值。它不会在数据库中保留默认值,因此删除默认值是正确的行为。”。似乎是某种 Django 的优化。 @lucastamoios 我不肯定...这似乎与评论中的第一个要点不同,这 似乎 只是在迁移...以上是关于数据库中默认值的Django实现的主要内容,如果未能解决你的问题,请参考以下文章