数据库中默认值的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实现的主要内容,如果未能解决你的问题,请参考以下文章

具有默认值的外键上的 Django 1.7 迁移错误

django 获取 POST 请求值的几种方法

默认值的 Django 表单验证错误

Django的model中日期字段设置默认值的问题

django项目 crm表结构

设置一个默认值的参数来路由django中的url