如何在 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 用户模型中获取电子邮件字段?