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

问题描述 投票:0回答:5

文档

CharField()
应用于较小的字符串,
TextField()
应用于较大的字符串。

好吧,但是“小”和“大”之间的界限在哪里呢?到底发生了什么导致这种情况发生?

sql django database storage
5个回答
493
投票

这是 RDBMS 的

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

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

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

CharField
,否则使用
TextField

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


49
投票

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

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


16
投票

例如.,.在模型中添加了 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
(标题),max_length(必需)定义为
varchar(64)

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

15
投票

当输入的字符串较大时,请使用

TextField
。当
max_length
参数传递到
TextField
时,它将长度验证传递给
TextArea
小部件。


4
投票

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

  article_title = models.CharField(max_length=150)
  article_body = models.TextField()
© www.soinside.com 2019 - 2024. All rights reserved.