2011-09-08 104 views
187

Django中CharField()TextField()和有什么不一样? documentation表示CharField()应该用于较小的字符串,而TextField()应该用于较大的字符串。好的,但“小”和“大”之间的界线在哪里?这种情况下发生了什么?Django CharField vs TextField

回答

214

这是RDBMS的varchar(或类似)之间的区别 - 通常用最大长度指定,并且在性能或存储方面可能更高效 - 以及text(或类似)类型 - 通常仅限于硬编码的实现限制(不是数据库模式)。 PostgreSQL 9,具体说,"There is no performance difference among these three types",但是AFAIK有一些不同之处,例如, MySQL,所以这是要记住的事情。

一个很好的经验法则是,如果需要限制最大长度,则使用CharField,否则为TextField

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

+24

反过来说,如果你使用CharField,那么你*必须*有最大长度 –

+10

我发现默认情况下使用'TextField'会影响你的应用程序的可移植性。 Postgres可能没有性能问题,但Oracle会将它存储为一个'CLOB',它有一些烦恼,就像不能在WHERE语句中使用该字段。只是需要考虑。 – Rob

+1

还应该考虑在Oracle中'CharField'不能具有大于2000的'max_length',或者它会发出一个'ORA-00910:指定的长度太长的数据类型'错误。 – Dinei

22

在某些情况下,它与使用该字段的方式有关。在某些数据库引擎中,字段差异决定了如何(以及如果)在字段中搜索文本。 CharFields通常用于可搜索的事物,例如,如果要在字符串“one plus two”中搜索“one”。由于字符串越短,发动机搜索的时间越少。 TextFields通常不是要通过搜索(比如也许是博客的主体),而是要保存大量的文本。现在大部分依赖于数据库引擎,就像在Postgres中一样,这并不重要。

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

3

例如,在下面的模型中添加了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; 

CharField(标题)的MAX_LENGTH(必需)被定义为varchar(64)

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

CharField为255个字符MAX_LENGTH而TextField可以容纳超过255个字符。如果有大字符串作为输入,请使用TextField。它很好地知道,当max_length参数传递给TextField时,它将长度验证传递给TextArea小部件。