Django CharFieldとTextField


302

違いは何であるCharField()TextField()Djangoのでは?ドキュメントはその言うCharField()小さな文字列を使用する必要があり、TextField()大きな文字列を使用する必要があります。わかりましたが、「小さい」と「大きい」の間に描かれた線はどこにありますか?これを裏付けるフードの下で何が起こっているのですか?

回答:


354

これは、RDBMS varchar(または類似)の違いです。これらは通常、最大長で指定され、パフォーマンスまたはストレージtext(および類似)の点でより効率的かもしれません。これらは通常、ハードコードされた実装制限によってのみ制限されます( DBスキーマ)。

具体的には、PostgreSQL 9には「これら3つのタイプにはパフォーマンスの違いはない」とありますが、MySQLなどにはいくつかの違いがあるため、注意が必要です。

経験則としてはCharField、最大長を制限する必要がある場合に使用し、TextFieldそうでない場合はそれを使用します。

これもDjango固有のものではありません。


43
逆に、CharFieldを使用する場合は、最大長が必要です
Sam Svenbjorgchristiensensen 2014年

17
TextFieldデフォルトで使用すると、アプリの移植性に影響を与える可能性があることがわかりました。Postgresのパフォーマンスに影響はないかもしれませんが、OracleはCLOBWHEREステートメントでフィールドを使用できないなどの不快な点があるものとして格納します。考慮すべきことだけです。
Rob

3
また、Oracle では2000 CharFieldmax_length超えることはできないため、ORA-00910: specified length too long for its datatypeエラーが発生することも考慮する必要があります。
Dinei 2017

フィールド属性を検討する際に、Postgresのドキュメントでも次のように述べていることに注意してください(強調は私の場合):「格納できる最長の文字列は約1 GBです(データ型宣言でnに許可される最大値はそれ以下[...]特定の上限なしで長い文字列を保存する場合は、任意の長さ制限を作成するのではなく、長さ指定子なしで変化するテキストまたは文字を使用してください。) "
iff_or

3
djangoでの2つの違いの本当に重要な違いは、ビューがフィールドを処理する方法です。一般的な編集ビューでは、TextFieldは複数行のサイズ変更可能な入力としてレンダリングされます。一方、CharFieldは単一行の入力です。私はTextFieldのdjangoソースを確認していませんが、生成されたHTMLがTextFieldに添付されている場合は、マルチラインテキストを適切に操作する方法を実装していると想定します。
ミッチェルウォールズ

36

場合によっては、フィールドの使用方法に関連しています。一部のDBエンジンでは、フィールドの違いによって、フィールド内のテキストを検索する方法(および検索する場合)が決まります。CharFieldsは通常、文字列「one plus two」で「one」を検索する場合など、検索可能なものに使用されます。文字列は短いため、エンジンが検索するのにかかる時間は短くなります。通常、TextFieldは(ブログの本文などの)検索対象ではなく、大量のテキストを保持するためのものです。現在、これのほとんどはDBエンジンに依存しており、Postgresのように問題ではありません。

問題にならない場合でも、ModelFormを使用すると、フォームに別のタイプの編集フィールドが表示されます。ModelFormは、CharFieldには1行のテキスト、TextFieldには複数行のサイズのHTMLフォームを生成します。


2
これは、フォームでフィールドを生成する方法について言及しているため、断然最良の説明です。Charfieldは1行の入力になりますが、TextFieldはサイズ変更可能な複数行になります。TextFieldは、主にジェネリッククラスビューを実装する場合に意味があります。説明フィールドなどに最適です。また、レンダーボックスがフィルター/検索に使用したくないと述べた方法も気に入っています。
ミッチェルウォール

8

たとえば。以下のようなモデルに2つのフィールドが追加されます。

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

以下は、移行が適用されたときに実行されるmysqlクエリです。


以下のためにTextField(説明)フィールドがAのように定義されますlongtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

TextFieldMySQL の最大長はstring-type-overviewによると4GB です。


以下のためにCharField(タイトル)MAX_LENGTH(必須)のように定義されますvarchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;

1
nit:Djangoのドキュメント推奨Avoid using null on string-based fields such as CharField and TextField::docs.djangoproject.com/en/2.0/ref/models/fields/#nullを維持するのが最善null=Falseです。
modulitos

7

CharFieldmax_lengthの255文字TextFieldがあり、複数の文字を保持でき255ます。TextField入力として大きな文字列がある場合に使用します。max_lengthパラメータがに渡されるTextFieldと、長さの検証がTextAreaウィジェットに渡されることを知っておくとよいでしょう。


「フィールドにunique = Trueを使用している場合VARCHAR、列タイプで保存されるフィールドはすべてmax_length255文字に制限されます。」(私の強調)
l0b0

-4

私は奇妙な問題を抱えていて、不愉快な奇妙な違いを理解しました:ユーザーからCharFieldとしてURLを取得し、それをhtmlのhrefのタグで使用すると、その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は2つの方法でDBにまったく同じように保存されますが、クリックしたときに結果が異なる理由がわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.