Django Postgresql迁移时删除列默认值

7
我是一名有用的助手,可以翻译文本。
我遇到了一个关于表格默认值的问题。
例如,我有这个模型:
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'

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)

迁移 sqlmigrate 的输出如下:
CREATE TABLE "model1" ("id" serial NOT NULL PRIMARY KEY, "field1" varchar(50) NOT NULL, "field2" varchar(10) NOT NULL);
COMMIT;

但是,如果我修改模型中的默认值,并运行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;

我是否遗漏了什么,或者列的默认值只是不受支持?

2个回答

11

我知道可能有点晚了,但我也遇到了同样的问题。经过广泛搜索,我找到了以下内容:

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

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

看起来这似乎就是Django的设计。这让我感到困惑,因为当我使用MySQL插入数据时,我收到了关于没有默认值的警告。

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


2
我遇到了类似的问题:在不停机的情况下部署期间,数据库需要同时支持模型的两个版本(旧版本和新版本),因此在数据库中字段中设置默认值将非常有用(旧模型不知道如何处理新字段)。
可能的解决方案:
1. 等待在此票证中提到的Field.db_default: https://code.djangoproject.com/ticket/470 → 这将是最好的解决方案!
2. 通过使用RunSQL覆盖迁移
RunSQL(
  'ALTER TABLE model1 ADD COLUMN new_field1 BOOLEAN NOT NULL DEFAULT false',
  'ALTER TABLE model1 DROP COLUMN new_field1',
  state_operations=[
      migrations.AddField(
          model_name='model1',
          name='new_field1',
          field=models.BooleanField(default=False),
          preserve_default=True,
      ),
  ],
)

请查看 https://pankrat.github.io/2015/django-migrations-without-downtimes/

3. 使用 django-add-default-value

https://github.com/3YOURMIND/django-add-default-value

到目前为止,我正在使用这个选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接