(最終更新月:2022年2月)
✔このような方へ向けて書かれた記事となります
「DjangoのModelFieldって何?仕組み、構成を知りたい。」
「ModelFieldにはどんなものがあるも?」
「それぞれの使い方が具体的にわかるといいんだけど、、」
✔当記事を通じてお伝えすること
- Django model fieldとは?
- Django model fieldの一覧【2022年】
- Django model fieldの使い方・実例
Django model fieldとは?
model fieldって何?役割は?
Djangoのモデルフィールドは、データベーステーブルのカラムに相当します。
つまり、Djangoのモデルフィールドを使いこなすことで、SQL言語を書かずにPythonでデータベースへの書き込みができるというメリットがあります。
また、データベースの種類を問わず、Pythonで記述をするだけで各データベースに対応してくれるのも更なるメリットの一つと言えます。
model fieldの構成
モデルフィールドを記述するのは、models.pyファイル内のmodels.Modelを継承したクラス内で下記の通り記述します。
フィールド名 = models.フィールドの型(フィールドオプション)
具体例は最後にお見せしますが、一例をご覧頂くとこのようになります。
from django import models
class SampleModelClass(models.Model):
title = models.CharField(max_length=100, default="sample default") #ここがモデルフィールド
今はわからなくても構いません。
順を追ってご説明していきます。
Django model fieldの一覧【2022年】
モデルフィールドを理解していくにあたり、①オプション②フィールドの型をご理解いただく必要があります。
まずはオプションから説明していきます。
models.フィールドの型(フィールドオプション)と、( )内に記述をするのがオプションです。
フィールドオプション一覧
オプション名 | 値 | デフォルト | 説明 |
---|---|---|---|
null | True/False | False | データベース内に空「NULL」として値が保存されます。 |
blank | True/False | False | データベース内の値がブランクとして保存することが許容されます。 |
choices | (データ、表示) | / | 最初の値がデータベースへ保存され、2つ目の値がブラウザで表示されます。 |
db_column | カラム名 | テーブル名 | データベースのカラム名を指定します。 |
db_index | True/False | / | Trueの場合、データベースインデックスが、このフィールドの為に生成されます。 |
db_tablespace | データベーステーブルスペース | DEFAULT_INDEX_ TABLESPACE | フィールドにインデックスが付けられている場合に、フィールドのインデックスに使用するデータベーステーブルスペースの名前を指定します。 |
default | 任意の値 | / | フィールドのデフォルト値を指定します。 |
editable | True/False | True | Falseの場合は、管理ページやモデルフォームなどに表示されません。編集ができないフィールドとなります。 |
error_messages | 任意の文字列 | 右記参照 | null、blank、invalid、invalid_choice、unique、unique_for_dateのキーを使って、値を指定することで、デフォルトのエラー時のメッセージを書き換えることができます。 |
help_text | 任意の文字列 | / | フォームウィジットと共に表示される補助テキストになります。 |
primary_key | True/False | False | Trueに設定すると、モデルクラスのプライマリーキーと認識されます。 |
unique | 任意の値 | False | Trueに設定した場合、同じ値での入力ができないようになります。ユーザー名などで使用すると効果があります。 |
unique_for_date | DateTime型 | False | DateFieldやDateTimeFieldで設定可能です。Trueの場合は同じ日付での保存ができなくなります。 |
unique_for_month | DateTime型 | False | 同じ月での保存ができません。 |
unique_for_year | DateTime型 | False | 同じ年での保存ができません。 |
verbose_name | String型 | フィールド名に 同じ | フォームのラベルや管理画面での表示用のフィールド名になります。 |
validators | / | / | フィールドに独自の制限を付けることができます。 |
以上がオプションです。
それぞれの型特有の引数もあります。フィールドの型一覧で確認していきましょう。
フィールドの型
2022年2月現在で公式サイトより抜粋し、情報は多少絞っていますが、英語なども混じっている箇所も日本語にしていますので、わかりやすくまとまっています。
フィールド名 = models.フィールドの型(フィールドオプション)の「models.」に続いて記述される部分になります。
【int型データを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
AutoField | 自動で保存される数値のフィールドです。 一つずつ数値が上がっていくIDに使用されるフィールドです。 | 特になし |
BigAutoField | 1から9223372036854775807まで可能なAutoFieldです。 | 特になし |
SmallAutoField | 1から32767まで保存可能なAutoFieldです。 | 特になし |
IntegerField | 整数で、-2147483648から2147483647が保存可能です。 | 特になし |
BigIntegerField | -9223372036854775808から9223372036854775807まで保存可能なIntegerFieldです。 | 特になし |
SmallIntegerField | -32768から32767まで保存可能なIntgerFieldです。 | 特になし |
PositiveIntegerField | 整数の中でも、0から2147483647までが保存できます。 | 特になし |
PositiveBigIntegerField | 整数の中でも、0から9223372036854775807までが保存できます。 | 特になし |
PositiveSmallIntegerField | 整数の中でも、32767までが保存できます。 | 特になし |
【Float型データを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
DecimalField | PythonのDecimal(浮動小数点)の値が保存されます。 | max_digits decimal_places |
FloatField | Pythonのfloat型の値が保存されます。 |
【Datetime型データを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
DateField | 日付が保存されるフィールドです。 | auto_now auto_now_add |
DateTimeField | 日付時間が保存されるフィールドです。 | auto_now auto_now_add |
TimeField | 時間が保存されるフィールドです。 | 特になし |
DurationField | timedelta型保存されます。 | 特になし |
【Str型データを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
CharField | テキストが保存されるフィールドです。 | max_length |
TextField | CharFieldの中でも、字数の多いテキストを保存するフィールドです。 | 特になし |
EmailField | CharFieldでEmailのみ保存可能としたフィールドです。 | 特になし |
SlugField | CharFieldでURLのスラッグなどに対応したフィールドです。 | 特になし |
FilePathField | CharFieldでファイルパスのみ保存可能としたフィールドです。 | path |
URLField | CharFieldでURLのみ保存可能としたフィールドです。 | 特になし |
【ファイルデータを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
FileField | ファイルが保存されます。 | upload_to |
ImageField | イメージファイルが保存されます。 | height_field(optional) width_field(optional) |
【その他のデータを保存するフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
BooleanField | TrueもしくはFalseが入るフィールドです。 | 特になし |
GenericIPAddressField | IPアドレスが保存されます。 | 特になし |
BinaryField | bytesなどを保存するフィールドです。 | max_length |
JSONField | JSONデータが保存されます。 | 特になし |
UUIDField | PythonのUUID型を保存します。 | 特になし |
【リレーションシップフィールド】
フィールド名 | 説明 | 必要な引数 |
---|---|---|
ForeignKey | 他のモデルクラスと連携します。 | to on_delete |
ManyToManyField | 複数のモデルクラスと連携します。 | to |
OneToOneField | 他のモデルクラスと一対一の関係で連携します。 | to on_delete |
Django ModelFieldの使い方・実例
よく使われるコードを使ってみます。
当ブログで一から作り方をご説明している日報アプリを一例にご紹介します。
【CharField】
title = models.CharField(max_length=100, verbose_name="タイトル")
【TextField】
content = models.TextField(verbose_name="内容")
【BooleanField】
public = models.BooleanField(default=False, verbose_name="公開する")
【SlugField】
slug = models.SlugField(max_length=20, unique=True, default=slug_maker)
デフォルト値を関数で指定しています。詳しくはこちらからどうぞ→ 記事「モデルフィールドのデフォルト値を関数で設定する」
【DateTimeField】
timestamp = models.DateTimeField(auto_now_add=True)
引数「auto_now_add」がTrueの場合、データ作成時の日時が自動で保存されます。
【ForeignKey】
user = models.ForeignKey(User, on_delete=models.CASCADE)
「User」モデルクラスを参照できるようします。
【OneToOneField】
user = models.OneToOneField(User, on_delete=models.CASCADE)
こちらでは、「User」モデルクラスと一対一で連携しています。
まとめ
当記事の内容をまとめていきます。
モデルフィールドとは、データベース上のカラムに相当します。
書き方としては、
フィールド名 = models.フィールドの型(フィールドオプション)
となります。
詳しいオプション、フィールドの型については、2022年2月現在は当記事の内容が全てです。
全て覚えるのは難しいので、必要な時に戻ってきて下さい。
また、より詳しくは公式サイトにも載っています。英語の記載などが多く少しわかりにくいところもあるかもしれませんが、当記事で全体を掴んだ上で進んでいただくことをオススメします。
公式サイト「モデルフィールドリファレンス」