Django的CharField与TextField

Django中的CharField()TextField()之间有什么区别? 该文件说, CharField()应该用于较小的string,而TextField()应该用于较大的string。 好的,“小”和“大”之间的界线在哪里? 这是怎么回事?

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

PostgreSQL 9特别指出“这三种types之间没有性能差异” ,但是AFAIK在MySQL等方面有一些差异,所以这是要记住的。

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

这也不是真正的Django。

在某些情况下,它与该领域的使用方式有关。 在某些数据库引擎中,字段差异决定了如何(以及如果)在字段中search文本。 CharFields通常用于可search的事物,例如,如果要在string“one plus two”中search“one”。 由于string较短,发动机search所耗费的时间较less。 TextFields通常不是要通过search(就像博客的主体),而是要保存大块的文本。 现在大部分依赖于数据库引擎,就像在Postgres中没有关系。

即使不重要,如果使用ModelForms,您将在窗体中获得不同types的编辑字段。 ModelForm将生成一个CharField的一行文本和一个TextField的多行文本的大小。

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