首页 > 解决方案 > 模型的 max_length 字段在 localhost 上不起作用

问题描述

我的模型有一个名为 title 的 CharField,其 max_length 设置为 30。我有一个解析器将数据解析到数据库,当我在本地主机上使用它时,我没有任何错误。

部署后,发生错误:

django.db.utils.DataError: value too long for type character varying(30)

我发现它正在尝试插入具有 35 个字符的值,但此错误未出现在我的本地主机上。我尝试使用 shell,并设法添加了一个包含 60 个字符的字段。怎么了?

class Coin(models.Model):
    symbol = models.CharField(max_length=20)
    title = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.title} ({self.symbol})'

标签: djangodjango-models

解决方案


我发现它正在尝试插入具有 35 个字符的值,但此错误未出现在我的本地主机上。我尝试使用 shell,并设法添加了一个包含 60 个字符的字段。怎么了?

并非所有数据库在执行约束方面都那么严格。根据您的评论,您在本地主机上使用 SQLite。在SQLite的文档中,我们读到:

(...) 请注意, SQLite会忽略类型名称(例如:)后面的括号中的数字参数- SQLite 不会对字符串、BLOB 或数值的长度施加任何长度限制(除了大的全局限制) . (...)VARCHAR(255)SQLITE_MAX_LENGTH

这意味着尽管 Django 会添加长度约束,但数据库不会“强制”它。对于 SQLite,VARCHAR(1), VARCHAR(255)NCHAR(55)都产生相同类型的列: a TEXT

在“生产服务器”端,您使用 PostgreSQL 数据库,并且根据文档,该数据库强制执行长度限制。在文档中,我们看到了示例:

INSERT INTO test2 VALUES ('too long');
ERROR:  value too long for type character varying(5)

除了长度(这里5),错误完全匹配。所以 PostgreSQL 确实强制了长度约束,并且没有接受数据。以上当然不是PostgreSQL产生错误的“确凿证据”,但需要大量的代码分析才能严谨地证实这一点,所以我希望这能让你信服。

因此,建议至少在(少量)时间内使用相同的“环境”测试您的应用程序,因为数据库、解释器等之间总是存在小的差异。是的,大多数数据库当然实现或多或少相同的系统,但有一些小的差异可能会产生一些影响。


推荐阅读