【问题标题】:What's the difference between CharField and TextField in Django?Django 中的 CharField 和 TextField 有什么区别?
【发布时间】:2011-11-13 08:26:47
【问题描述】:

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

好的,但是“小”和“大”之间的界限在哪里?导致这种情况的幕后原因是什么?

【问题讨论】:

    标签: sql django database storage


    【解决方案1】:

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

    PostgreSQL 9 明确指出 "There is no performance difference among these three types",但 AFAIK 存在一些差异,例如MySQL,所以要记住这一点。

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

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

    【讨论】:

    • 反之,如果你使用 CharField 那么你必须有一个最大长度
    • 我发现默认使用TextField 会影响应用的可移植性。 Postgres 的性能可能不会受到影响,但 Oracle 会将其存储为 CLOB,这会带来一些烦恼,例如无法在 WHERE 语句中使用该字段。只是需要考虑的事情。
    • 还应该考虑到,在 Oracle 中,CharFieldmax_length 不能大于 2000,否则会发出 ORA-00910: specified length too long for its datatype 错误。
    • 有用的注意,在考虑字段属性时,Postgres 文档also say(强调我的):“可以存储的最长可能字符串约为 1 GB。(最大值将是数据类型声明中允许的 n 小于 [...] 如果您希望存储没有特定上限的长字符串,请使用不带长度说明符的文本或字符可变 ,而不是组成任意长度限制.)"
    • 我相信 django 中两者之间真正重要的区别是视图将如何处理该字段。在通用编辑视图中,TextField 将呈现为多行可调整大小的输入;而 CharField 是单行输入。我还没有查看 TextField 的 django 源代码,但我会假设如果任何生成的 html 附加到 TextField,那么它很可能会实现一种正确操作多行文本的方法。
    【解决方案2】:

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

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

    【讨论】:

    • 这是迄今为止最好的解释,因为它提到了它如何在表单中生成字段。 Charfield 将只是一个单行输入,但 TextField 将是一个可调整大小的多行。当您主要实现通用类视图时,TextField 才有意义。它适用于描述字段等。我也喜欢 renderbox 提到你不想将它用于任何过滤器/搜索的方式。
    【解决方案3】:

    CharField 的 max_length 为 255 个字符,而 TextField 可以容纳超过 255 个字符。当您有一个大字符串作为输入时,使用TextField。很高兴知道当max_length 参数被传递到TextField 时,它会将长度验证传递给TextArea 小部件。

    【讨论】:

    • “使用 VARCHAR 列类型存储的任何字段都将其 max_length 限制为 255 个字符如果您对该字段使用 unique=True。”(我的强调。)
    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2019-07-06
      • 1970-01-01
      • 2018-06-18
      • 2014-07-22
      • 2014-03-02
      • 2021-12-04
      • 2014-04-16
      相关资源
      最近更新 更多