ChatGPT解决这个技术问题 Extra ChatGPT

Django 中的 CharField 和 TextField 有什么区别?

documentation 表示 CharField() 应该用于较小的字符串,而 TextField() 应该用于较大的字符串。

好的,但是“小”和“大”之间的界限在哪里?这里的引擎盖下发生了什么?


C
Cat Plus Plus

这是 RDBMS 的 varchar(或类似)类型之间的区别——它们通常指定最大长度,并且在性能或存储方面可能更有效——和 text(或类似)类型——它们通常仅受以下限制硬编码的实现限制(不是数据库模式)。

具体来说,PostgreSQL 9 声明了 "There is no performance difference among these three types",但是 AFAIK 在例如 MySQL 中存在一些差异,因此需要牢记这一点。

一个好的经验法则是,当您需要限制最大长度时使用 CharField,否则使用 TextField

这也不是真正的 Django 特定的。


相反,如果你使用 CharField 那么你必须有一个最大长度
我发现默认使用 TextField 会影响应用程序的可移植性。 Postgres 可能不会对性能造成影响,但 Oracle 会将其存储为 CLOB,这会带来一些麻烦,例如无法在 WHERE 语句中使用该字段。只是需要考虑的事情。
还应考虑在 Oracle 中 CharFieldmax_length 不能大于 2000,否则会发出 ORA-00910: specified length too long for its datatype 错误。
需要注意的是,在考虑字段属性时,Postgres 文档 also say(强调我的):“可以存储的最长可能字符串约为 1 GB。(数据类型声明中允许的最大值小于那个 [...] 如果您希望存储没有特定上限的长字符串,请使用文本或字符变化 没有长度说明符,而不是构成任意长度限制。)”
我相信 django 中两者之间真正重要的区别是视图将如何处理该字段。在通用编辑视图中,TextField 将呈现为多行可调整大小的输入;而 CharField 是单行输入。我还没有查看 TextField 的 django 源代码,但我将假设如果任何生成的 html 附加到 TextField,那么它很可能会实现一种正确操作多行文本的方法。
r
renderbox

在某些情况下,它与该字段的使用方式有关。在某些数据库引擎中,字段差异决定了您如何(以及是否)在字段中搜索文本。 CharFields 通常用于可搜索的内容,例如如果您想在字符串“一加二”中搜索“一”。由于字符串更短,因此引擎搜索所需的时间更少。 TextFields 通常不是用来搜索的(比如可能是博客的正文),而是用来保存大块文本。现在大部分依赖于数据库引擎,就像在 Postgres 中一样,这并不重要。

即使没关系,如果您使用 ModelForms,您会在表单中获得不同类型的编辑字段。 ModelForm 将生成一个 HTML 表单,其大小为 CharField 的一行文本和 TextField 的多行文本。


这是迄今为止最好的解释,因为它提到了它如何在表单中生成字段。 Charfield 将只是一个单行输入,但 TextField 将是一个可调整大小的多行。当您主要实现通用类视图时,TextField 是有意义的。它适用于描述字段等。我也喜欢 renderbox 提到您不想将它用于任何过滤器/搜索的方式。
N
Njeru Cyrus

CharField 的最大长度为 255 个字符,而 TextField 可以容纳超过 255 个字符。当您有一个大字符串作为输入时使用 TextField。很高兴知道,当 max_length 参数传递到 TextField 时,它会将长度验证传递给 TextArea 小部件。


“使用 VARCHAR 列类型存储的任何字段都将其 max_length 限制为 255 个字符如果您对该字段使用 unique=True。”(我的重点。)
C
Community

例如,。在如下模型中添加了 2 个字段..

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

以下是应用迁移时执行的 mysql 查询。

对于 TextField(描述),该字段被定义为 longtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

根据string-type-overview,MySQL 的TextField 的最大长度为 4GB。

对于 CharField(title),max_length(required) 定义为 varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;

nit:Django 文档推荐:Avoid using null on string-based fields such as CharField and TextFielddocs.djangoproject.com/en/2.0/ref/models/fields/#null,所以最好保留 null=False
M
Murad

TextField 可以包含超过 255 个字符,但 CharField 用于存储较短长度的字符串。

当您想要存储长文本时,使用 TextField,或者当您想要较短的字符串时,CharField 很有用。

  article_title = models.CharField(max_length=150)
  article_body = models.TextField()