2011-09-08 107 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小部件。