Django在数据库中实现默认值

时间:2017-04-17 18:09:07

标签: python sql django postgresql django-models

我在模型上有一个字段:

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 个答案:

答案 0 :(得分:4)

django/db/backends/base/schema.py的评论,从ln开始。 571,详细介绍了这里涉及的步骤:

  

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

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

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