我有一些文本列恰好包含2个字符.当我将models.CharFieldmax_length=2一起使用时,它仍然会创建一个Varchar.我判断了https://docs.djangoproject.com/en/5.0/ref/models/fields/,但找不到要传递的字段类型或参数来获取Char(x)列而不是Varchar(x).TextField也不适合这个.据我所知,Varchar使用2个额外的字节来存储长度信息,这在这里是浪费.那么如何让Django创建固定字符长度的列呢?

编辑: 经历了这个(CharField with fixed length, how?),似乎没有办法强迫Django创建Char,它总是会创建Varchar,并且可以将最小-最大长度验证器放在上面.

推荐答案

Django确实会始终使用VARCHAR,所以除非您编写自己的自定义后台,否则它将始终使用VARCHAR(2).但是,您可以添加MinLengthValidator [Django-doc]并添加CheckConstraint [Django-doc]以在数据库上强制执行此操作:

from django.core.validators import MinLengthValidator
from django.db.models.lookups import GreaterThanOrEqual
from django.db.models.functions import Length


class MyModel(models.Model):
    my_field = models.CharField(max_length=2, validators=[MinLengthValidator(2)])

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=GreaterThanOrEqual(Length('my_field'), 2),
                name='at_least_two_characters',
            )
        ]

Django相关问答推荐

如何在Django CMS中更新上下文

如何将我的函数添加到值参数?

如何根据状态计算表中数据的数量?

如何连接到 docker 容器中的 postgres 数据库?

如何在Django中制作一个不 Select 以前日期的日期 Select 器

Pytest-django - 测试创建和传递所需的用户对象

Django 和 HTML 无法从指定时间开始视频

在 django HTML 邮箱模板中使用字体

如何在 gunicorn conf 文件中指定 uvicorn 工作人员

Django ORM:获取每个类别的月平均价格

Django 在模型中存储用户图像

当我告诉它时,如何使用 Django 的记录器来记录回溯?

多租户 Django 应用程序:根据请求更改数据库连接?

Django: Admin:在管理员中更改字段的小部件

如何在python中遍历httprequest post变量

单击弹出框会滚动回页面顶部 [Bootstrap 和 Django]

将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

django-getlist()

Django REST 框架中的每个字段权限