【问题标题】:Django implementation of default value in database数据库中默认值的Django实现
【发布时间】: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;

【问题讨论】:

    标签: python sql django postgresql django-models


    【解决方案1】:

    cmets 到django/db/backends/base/schema.py,开始 ln。 571,详细说明这里涉及的步骤:

    当使用给定的默认值将列 NULL 约束更改为 NOT NULL 时,我们需要执行 4 个步骤:

    1. 为新传入的写入添加默认值
    2. 使用新的默认值更新现有的 NULL 行
    3. 用 NOT NULL 替换 NULL 约束
    4. 再次删除默认设置。

    Django 通常不使用内置的 SQL 默认值来设置值(请记住,Django 可以使用可调用值作为默认值)。您可以在此rejected bug report 中找到更多信息。

    【讨论】:

    • 非常感谢!在您发布的错误报告中,有人仍然说“Django 使用数据库默认值来设置表中现有行的值。它不会在数据库中保留默认值,因此删除默认值是正确的行为。”。似乎是某种 Django 的优化。
    • @lucastamoios 我不肯定...这似乎与评论中的第一个要点不同,这 似乎 只是在迁移...
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多