Django在数据库中实现默认值

luc*_*ios 4 python sql django postgresql django-models

我在模型上的一个字段是:

class SomeModel(models.Model):
    some_field = models.CharField(max_length=10, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

然后,我将模型更改为:

class SomeModel(models.Model):
    some_field = models.CharField(max_length=10, default='')
Run Code Online (Sandbox Code Playgroud)

当我运行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;
Run Code Online (Sandbox Code Playgroud)

我不理解为什么Django DROP DEFAULT在表中应用a ,因为我正在创建默认值。如果这是正确的,Django如何实现默认值?

有关我的工具的信息:

  • PostgreSQL 9.5;
  • Django 1.11b1;

bri*_*pck 6

从ln开始的对django / db / backends / base / schema.py的注释。571,详细说明此处涉及的步骤:

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

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

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

  • @lucastamoios 我并不乐观......这似乎与评论中的第一个要点不同,这*似乎*只是在迁移过程中对传入值的保护...... (2认同)