Django CharField与TextField


302

CharField()TextField()Django有什么区别?该文件说,CharField()应该用于更小的字符串,TextField()应使用较大的字符串。好的,但是“小”和“大”之间的界线在哪里?这到底是怎么回事?

Answers:


354

RDBMS varchar(或类似的数据库)之间的区别是-通常以最大长度来指定,并且在性能或存储方面可能更为有效-和text(或类似的)类型-这些通常仅受硬编码实现限制(而不是数据库架构)。

PostgreSQL 9特别指出“这三种类型之间没有性能差异”,但是AFAIK在MySQL等方面有一些差异,因此请记住这一点。

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

这也不是真的特定于Django。


42
相反,如果使用CharField,则必须具有最大长度
Sam Svenbjorgchristiensensen

17
我发现TextField默认情况下使用会影响应用程序的可移植性。Postgres可能不会对性能造成影响,但是Oracle会将它存储为CLOB有一些烦人的内容,例如无法在WHERE语句中使用该字段。只是要考虑的事情。
罗布

3
还应该考虑到在Oracle CharField中不能max_length超过2000,否则会发出ORA-00910: specified length too long for its datatype错误。
Dinei

值得一提的是,在考虑字段属性时,Postgres文档也会说(强调我的意思):“可以存储的最长字符串约为1 GB。(数据类型声明中n所允许的最大值是小于该值。如果您想存储没有特定上限的长字符串,请使用没有长度说明符的文本或字符变化,而不是设定一个任意的长度限制。)“
iff_or

3
我相信django两者之间真正重要的区别在于视图如何处理该字段。在常规编辑视图中,TextField将呈现为多行可调整大小的输入;而CharField是单行输入。我没有看过TextField的django源代码,但我将假设是否将任何生成的html附加到TextField,那么它很可能会实现一种正确处理多行文本的方法。
米切尔·沃尔斯'18

36

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

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


2
到目前为止,这是最好的解释,因为它提到了它如何以表单形式生成字段。Charfield将仅是单行输入,而TextField将是可调整大小的多行。当您主要实现泛型类视图时,TextField是有意义的。它非常适合描述字段等。我也很喜欢renderbox提到您不想将其用于任何过滤器/搜索。
米切尔墙

8

例如。如下模型中添加了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;

TextField根据字符串类型概述,MySQL 的最大长度为4GB


for 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;

1
尼特:Django文档建议:Avoid using null on string-based fields such as CharField and TextFielddocs.djangoproject.com/en/2.0/ref/models/fields/#null所以最好保持null=False
modulitos

7

CharField255字符数上限为max_length个,但TextField可以容纳多个255字符。使用TextField时,你有一个大的字符串作为输入。很高兴知道,当max_length参数传递给a时,TextField它将长度验证传递给TextArea小部件。


如果您对字段使用unique = True,那么任何与VARCHAR列类型一起存储的字段都将max_length限制为255个字符 ”(我的强调。)
l0b0

-4

我遇到了一个奇怪的问题,并理解了一个令人不愉快的奇怪区别:当我从用户那里获取一个URL作为CharField,然后在href标记中的html中使用它时,它将该URL 添加到了我的URL中,这不是我想要的。但是当我通过Textfield进行操作时,它只是通过用户输入的URL。看这些:我的网站地址:http://myweb.com

CharField entery: http://some-address.com

单击时: http://myweb.comhttp://some-address.com

TextField输入法: http://some-address.com

单击时: http://some-address.com

不得不提的是,URL保存完全一样通过两种方式在DB,但我不知道为什么他们点击时的结果是不同的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.