CharField和TextField在Django中的区别是什么?

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

好吧,但是“小”和“小”之间的界限在哪里?和“large" ?这里面到底发生了什么?

180739 次浏览

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

PostgreSQL 9,具体来说,声明"这三种类型在表现上没有差别",但AFAIK有一些不同,例如MySQL,所以这是要记住的东西。

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

这也不是django特有的。

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

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

例如,。2个字段被添加到如下的模型中。

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

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


对于TextField(description),该字段定义为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;

CharField的最大长度为255字符,而TextField可以容纳多于255字符。当你有一个大字符串作为输入时,使用TextField。当max_length参数被传递给TextField时,它将长度验证传递给TextArea小部件。

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

当你想存储长文本时,使用TextField,或者当你想要更短的字符串时,CharField是有用的。

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