【问题标题】:How to enforce char(N) datatype instead of varchar(N) in django model field如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)
【发布时间】: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),但它有它的用例。

标签: mysql django postgresql django-models django-orm


【解决方案1】:

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

【讨论】:

【解决方案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

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 2019-01-11
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2020-09-01
    • 2023-03-08
    相关资源
    最近更新 更多