モデルのフィールドオプションについて
Djangoではモデルを作成してDBのテーブルに対応するものを作成することができる。
※Id、タイトル、作成者、作成日時など・・・
モデルはDBのテーブルに対応し、モデルの各フィールドがDBのテーブルの項目(カラム)に対応する。
各フィールドはデータ型、長さ、空の値、未入力の許可などのオプションを設定することができる。
この記事ではフィールドオプションについてまとめる。
モデルのフィールドオプション一覧
null
null=Trueの場合、空の値を保持する。デフォルト設定はFalse。
アプリケーションのユーザーが、フォーム入力時に空の値の入力を許可したいときは、blank=Trueも同時に設定しておく必要がある。
CharFieldやTextFieldのような文字列のフィールドではnullは使用しない。文字列ベースのフィールドがnull=Trueである場合、データがないことに対してNull(本当の意味でデータがない)と空の文字列の2種類が存在してしまうため。
参考:【Django】モデルのフィールドでblankとnullの組み合わせ
blank
blank=Trueの場合、フィールドはブランク(NULL)が許容される。
nullはDB上でNULLであることが許容されるが、blankはフォーム上でNULLであることが許容される。
blank=Falseの場合、フォーム上で必ず入力しなければならない。
blank=Trueの場合、フォームは任意入力になる。
null=Falseの場合、DBに必ず何かしらの値を保存しなければならない。
null=Trueは、CharFieldかTextFieldの文字列を扱うフィールドであり、かつオプションがunique=True, blank=Trueの場合のみ使用する。
参考:【Django】モデルのフィールドでblankとnullの組み合わせ
choices
選択肢を作成するときに使用する。
db_column
テーブルのカラム名を指定することができる。
未指定の場合はフィールド名が自動で使用される。
db_comment
DBのテーブルに関してコメントをつけることができる。
管理者・開発者向けのオプションで、カラムが持つ情報や意味を伝え、コードを読まずともDBに関する情報を得ることができる。
db_index
db_index=Trueの場合、インデックスが生成される。
インデックスはDBのクエリの高速化やパフォーマンス向上に寄与する。
検索が頻繁に行われるフィールドか、外部キーの参照先のフィールドに対して設定される。
インデックスを作成すると、データの挿入や更新が遅くなる可能性があるので、全データにインデックスを作成するべきではない。
db_indexはオプションとして存在するが、Djangoのドキュメントではindexesの仕様が推奨されている。
db_tablespace
default
フィールドにデフォルトで値を設定したいときに使用する。
editable
editable=Falseの場合、フィールドは管理画面や他のModelFormに表示されない。バリデーションもスキップされる。
error_messages
特定のエラー時に表示するメッセージを指定した内容で出すことができる。
辞書形式で指定する。null、blank、invalid、invalid_choic、unique、unique_for_dateなど各種オプションをキーとして持つ。
例えば、blank=Falseでオプションを設定しているにも関わらず、フィールドに入力がされていなかった場合、以下のようにオプションとして設定することができる。
error_messages={‘blank’ : ‘必須入力項目です’}
help_text
フォームとともに表示される補助メッセージ。
そのフィールドの補足や説明を管理画面やフォームで提供する。
primary_key
Trueの場合、そのフィールドのはそのモデル(DBにおけるテーブル)の主キーになる。
モデル内のどのフィールドにもprimary_keyが設定されていない場合、Djangoが自動で主キーを持つフィールドを作成する。このフィールドは自動インクリメントする。
また、primary_keyはunique=True, null=Falseのオプションも備え持つ。データは一意であり、DBに必ず値が保存されなければならない。
参考:ドキュメント上の「自動インクリメントのプライマリキーフィールド」
unique
Trueの場合、そのフィールドの全てのデータは一意のデータでなければならず、重複は許されない。
uniqueオプションはインデックスを自動作成するので、db_indexの指定は不要。
unique_for_date
ある日付フィールドが別のフィールドに対して一意の制約を持つ。
例えば、以下のモデルがあった場合、ある日付に対して、titleは1でなければならず、同じ日付に複数の同じtitleを持つレコードは作成できない。
1 2 3 4 5 6 |
from django.db import models class MyModel(models.Model): title = models.CharField(max_length=100) pub_date = models.DateField() unique_for_date = 'pub_date' |
unique_for_month
unique_for_year
verbose_name
そのフィールドに対して、管理者サイト上で人が理解しやすい名前を付けるためのオプション
validators
そのフィールドに対して、実行するバリデーションを指定する。
あるフィールドに入力された値が0以上100以下であることを保証するため、2つのバリデーションがある場合、この2つのバリデーションを使用することを明示するときに使用する。
number = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])
・入力値が0以上であるかを確認するバリデーション
・入力値が100以下であるかを確認するバリデーション
参考:バリデータ | Django ドキュメント | Django (djangoproject.com)
Django記事一覧
参考:モデルフィールドリファレンス | Django ドキュメント | Django (djangoproject.com)
コメント