Django Postgresql 在迁移时删除列默认值

Cri*_*gas 3 django postgresql default migrate

我面临着表格默认值的问题。

例如我有这个模型:

class model1(models.Model):
        field1 = models.CharField(max_length=50, default='My Default Value 1',db_column='field1')
        field2 = models.CharField(max_length=10)

        class Meta:
            db_table = 'model1'
Run Code Online (Sandbox Code Playgroud)

并且 postgresql 表是在没有默认值的情况下生成的:

mydb=# \d model1
                                Table "public.model1"
 Column |         Type          |                      Modifiers                      
--------+-----------------------+-----------------------------------------------------
 id     | integer               | not null default nextval('model1_id_seq'::regclass)
 field1 | character varying(50) | not null
 field2 | character varying(10) | not null
Indexes:
    "model1_pkey" PRIMARY KEY, btree (id)
Run Code Online (Sandbox Code Playgroud)

migrate sqlmigrate 的输出是:

CREATE TABLE "model1" ("id" serial NOT NULL PRIMARY KEY, "field1" varchar(50) NOT NULL, "field2" varchar(10) NOT NULL);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

但是如果我修改模型中的默认值并运行 makemigrations/migrate 然后我查看 sqlmigrations 输出在创建后生成一个奇怪的 DROP DEFAULT

ALTER TABLE "model1" ALTER COLUMN "field1" SET DEFAULT 'My Default Value 1 modified';
ALTER TABLE "model1" ALTER COLUMN "field1" DROP DEFAULT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

是否有我遗漏的内容或不支持列的默认值?

rbe*_*ell 6

我知道这有点晚了,但我遇到了同样的问题。经过广泛搜索,我发现了这个

“Django 使用数据库默认值来设置表中现有行的值。它不会在数据库中保留默认值,因此删除默认值是正确的行为。”

https://code.djangoproject.com/ticket/28000

所以看起来这就是 django 的设计方式。这让我很烦恼,因为当我使用 MySQL 插入数据时,我收到了关于没有默认值的警告。

唉,我相信比我更聪明的人可以想出一个很好的解释来解释他们为什么这样设计。