如何从Django的postgres表和字段名称中删除双引号?

时间:2020-02-20 19:01:12

标签: python django postgresql

我正在使用PostgreSQL开发Django项目,其中表和字段名称是使用 双引号。有人知道如何禁用此行为吗?

[模型定义]

class Test1(models.Model):
    key = models.UUIDField('key', db_column='KEY', editable=False, unique=True, default=uuid.uuid4)
    name = models.CharField('name', db_column='NAME', max_length=128, null=False)

    class Meta:
        db_table = 'Test1'

[迁移]

operations = [
        migrations.CreateModel(
            name='Test1',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('key', models.UUIDField(db_column='KEY', default=uuid.uuid4, editable=False, unique=True, verbose_name='key')),
                ('name', models.CharField(db_column='NAME', max_length=128, verbose_name='name')),
            ],
            options={
                'db_table': 'Test1',
            },
        ),
    ]

[生成DDL]

create table "Test1"
(
    id serial not null constraint "Teste4_pkey" primary key,
    "KEY"  uuid not null constraint "Teste4_KEY_key" unique,
    "NAME" varchar(128) not null
);

alter table "Test1" owner to postgres;

[期望DDL]

create table Test1
(
    id serial not null constraint "Teste4_pkey" primary key,
    KEY  uuid not null constraint "Teste4_KEY_key" unique,
    NAME varchar(128) not null
);

alter table "Test1" owner to postgres;

[要求]

  • django == 2.1.10
  • django-choices == 1.6.1
  • django-cors-headers == 2.4.0
  • django-environ == 0.4.5
  • django-extensions == 2.1.4
  • djangorestframework == 3.8.2
  • django-filter == 2.0.0
  • drf_yasg == 1.14.0
  • ruamel.yaml == 0.15.100
  • drf-nested-routers == 0.91
  • dj-database-url == 0.5.0
  • requests == 2.22
  • whitenoise == 4.1.3
  • dry-rest-permissions == 0.1.10
  • django-polymorphic == 2.1.2
  • psycopg2 == 2.7.0
  • elastic-apm == 4.2.2
  • brutils == 1.0.1
  • Jinja2 == 2.10.3
  • schedule == 0.6.0
  • pika == 1.1.0
  • python-jose == 1.4.0

2 个答案:

答案 0 :(得分:0)

这是在Django中设计的,因此是有意设计的。这是参数化的方式。
假设某人的列名带有test column name之类的空格,然后考虑会发生什么。 它将导致一些不必要的错误,因此请不要更改框架的底层逻辑。

答案 1 :(得分:0)

感谢@BjarniRagnarsson,大写字母正像@Sanjay所提到的那样使框架具有这种行为。

解决方案:

class Test1(models.Model):
    key = models.UUIDField('key', db_column='key', editable=False, unique=True, default=uuid.uuid4)
    name = models.CharField('name', db_column='name', max_length=128, null=False)

    class Meta:
        db_table = 'test1'