文档说CharField()应该用于较小的字符串和TextField()应该用于较大的字符串。

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


当前回答

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

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

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


对于TextField(description),该字段被定义为长文本

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个字符的max_length,而TextField可以持有超过255个字符。使用TextField当你有一个大字符串作为输入。当max_length参数被传递到TextField时,它将长度验证传递给TextArea小部件。

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

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

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


对于TextField(description),该字段被定义为长文本

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;

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

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

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

In some cases it is tied to how the field is used. In some DB engines the field differences determine how (and if) you search for text in the field. CharFields are typically used for things that are searchable, like if you want to search for "one" in the string "one plus two". Since the strings are shorter they are less time consuming for the engine to search through. TextFields are typically not meant to be searched through (like maybe the body of a blog) but are meant to hold large chunks of text. Now most of this depends on the DB Engine and like in Postgres it does not matter.

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

这是RDBMS的varchar(或类似类型)和文本(或类似类型)之间的区别,前者通常指定最大长度,在性能或存储方面可能更有效,后者通常仅受硬编码实现限制(而不是DB模式)。

PostgreSQL 9特别指出,“这三种类型之间没有性能差异”,但我想在例如MySQL中有一些差异,所以这是要记住的。

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

这也不是django特有的。