DjangoのCharField()
とTextField()
の違いは何ですか? ドキュメント は、小さな文字列にはCharField()
を使用し、大きな文字列にはTextField()
を使用する必要があることを示しています。わかりましたが、「小」と「大」の間に線が引かれていますか?ここでフードの下で何が起こっているのですか?
RDBMSのvarchar
(または類似)—通常は最大長で指定され、パフォーマンスまたはストレージの点でより効率的かもしれません—とtext
(または類似)タイプ—通常、ハードコードされた実装制限( DBスキーマではありません)。
PostgreSQL 9では、具体的には、 「これらの3つのタイプにパフォーマンスの違いはありません」 ですが、知る限りではいくつかの違いがあります。 MySQL、これは心に留めておくべきものです。
目安として、最大長を制限する必要がある場合はCharField
を使用し、それ以外の場合はTextField
を使用します。
これは実際にはDjango固有ではありません。
場合によっては、フィールドの使用方法に関係しています。一部のDBエンジンでは、フィールドの違いにより、フィールド内のテキストを検索する方法(および検索するかどうか)が決まります。 CharFieldsは通常、文字列「one plus two」で「one」を検索する場合など、検索可能なものに使用されます。文字列は短いため、エンジンが検索するのにかかる時間は短くなります。 TextFieldsは通常、検索対象ではなく(ブログの本文のように)、大量のテキストを保持するためのものです。現在、これのほとんどはDBエンジンに依存しており、Postgresのように重要ではありません。
重要ではない場合でも、ModelFormsを使用すると、フォームに異なるタイプの編集フィールドが表示されます。 ModelFormは、CharFieldでは1行のテキスト、TextFieldでは複数行のサイズのHTMLフォームを生成します。
たとえば。以下のようなモデルに2つのフィールドが追加されます。
description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)
以下は、移行が適用されたときに実行されるmysqlクエリです。
TextField
(description)の場合、フィールドはlongtext
として定義されます
ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
MySQLのTextField
の最大長は、 string-type-overview に従って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;
CharField
の最大長は255
文字ですが、TextField
は255
文字を超えることができます。入力として大きな文字列がある場合は、TextField
を使用します。 max_length
パラメーターがTextField
に渡されると、長さの検証がTextArea
ウィジェットに渡されることを知っておくと便利です。