如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)

Posted

技术标签:

【中文标题】如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)【英文标题】:How to enforce char(N) datatype instead of varchar(N) in django model field 【发布时间】:2016-03-31 03:14:53 【问题描述】:

根据 django 文档https://docs.djangoproject.com/en/1.9/topics/db/models/

这是 ORM 创建 varchar 字段而不是 char

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

等价的sql语句

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
); 

所以在这里我们可以看到它正在使用 varchar,但我可以使用 char 代替吗?我找不到办法。 除了手动更改列

【问题讨论】:

你想要这个有什么具体原因吗? 如果很少有varchar 变成char,那不会提高数据库性能吗?我只是好奇,我可能错了@IgnacioVazquez-Abrams @IgnacioVazquez-Abrams 这种类型的东西对于维护数据完整性非常有用。例如我有一个可以是 5 个字符的代码或 null 的字段。而已。其他任何事情都应该失败。在 OPs 的情况下,我不确定它是否是最佳的(每个名称需要 30 个字符和大量空格填充 - eww),但它有它的用例。 【参考方案1】:

我认为你最好的办法是写一个custom field type,基于CharField 并改变它的db_type() 方法。查看相关示例here

【讨论】:

请在下面查看我的答案以获取示例 (***.com/a/61561841/3017716)【参考方案2】:

对于那些对@andrai-avram 给出的答案感到困惑的人, 这就是它的样子:

from django.db import models
class ActualCharField(models.CharField):
    def db_type(self, connection):
        varchar: str = super().db_type(connection)
        char: str = varchar.replace('varchar', 'char')
        return char

然后就用这个类代替默认的django.db.models.CharField

【讨论】:

以上是关于如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 Django ManyToMany 字段上强制执行唯一性?

Django用户模型电子邮件字段:如何使其成为强制性

如何在需要的基本 Django 用户模型中获取电子邮件字段?

在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?

如何在 Django 数据库模型的字段中存储字典

在 Django 中将模型字段设置为必填