【図解あり】Djangoモデル よく使うフィールド一覧
モデルの扱い方がよくわからない…
解説・サンプルコードを見ても何してるかよくわからない…
djangoモデルを扱う上でこれらのような課題に直面したことあるかと思います。結局馴染みがなければ、コードを見ても字面だけで理解するのは難しいかと思います。
したがって今回djangoのモデルについて分かりにくい部分を図を使って解説しています。
「イマイチモデルについてよくわからない」といった方にオススメの内容になっているかと思います。
1. 今回の解説内容
今回は、モデルで一番躓きやすいと思われるフィールドタイプとフィールドオプションについて解説していきます。
フィールドタイプやオプションの用語については、以下のように定義して進めていきます。
またフィールドタイプやオプションについてはかなりの数があり全てを紹介するのは難しいためよく使うものにフォーカスして解説していきます。
2. モデルの役割と特徴
本題に入る前に、djangoのモデル役割や特徴について簡単に解説します。
すでに基礎をある程度理解されている方は、この章を読み飛ばしていただいても結構です。
◆モデルの役割
上図の通りHTMLファイルに埋め込むためのデータをDB(データベース)とやり取りし、ビュー(views.py)に返します。ビューがイマイチよくわからないという方は、以下も併せてご確認ください。
◆モデルの特徴
djangoのモデルの特徴として、「Django ORM(Object-Relational Mapper)」という仕組みが備わっていてDBのレコードをモデルオブジェクトとして扱えるようにしています。
あまりピンとこないかもしれませんが、要するにCREATE文やALTER文等の生のSQL文を書かずにDBにアクセスでき開発できるのが特徴です。
djangoのモデルの良さとしては、可能な限りDBの種類(SQLite、MySQL、PostgresQL)による違いを吸収してくれることです。
では、本題のmodels.pyに記載する内容について解説していきます。
3. DBテーブルを作成するためのフィールド
では実際DBテーブルを作成するためのフィールドについて解説していきます。
3.1 書き方
models.py
from django.db import models
#クラスを定義
class Post(models.Model):
#作成するテーブルに応じたフィールドを使いアトリビュート設定
title = models.CharField(max_length=255)
body=models.TextField()
上記の「CharField」や「TextField」にあたる部分がフィールドタイプです。
フィールドタイプには様々な種類があり、作りたいテーブルに合わせてフィールドタイプを選択する必要があります。
どのような種類があってどれが頻出なのか解説していきます。
3.2 よく使うフィールドタイプ
◆BooleanFieldの解説
構文:BooleanField(**options)
True/Falseフィールドです。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
#BooleanField設定
is_public = models.BooleanField(verbose_name="公開")
管理画面
◆CharFieldの解説
構文:CharField(max_length=None, **options)
文字列のためのフィールドです。max_length(文字数)を設定する必要があります。(設定しなければエラー)
max_lengthは最大255まで設定できます。
サンプルコード
from django.db import models
class Post(models.Model):
#CharField設定
title = models.CharField(max_length=255)
body = models.TextField()
is_public = models.BooleanField(verbose_name="公開")
管理画面
◆TextFieldの解説
構文:TextField(**options)
CharFieldより長い文字列を記載するためのフィールドです。CharFieldとは異なりmax_length(文字数)の設定は不要です。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
#TextField設定
body = models.TextField()
is_public = models.BooleanField(verbose_name="公開")
管理画面
◆DateFieldの解説
構文:DateField(auto_now=False, auto_now_add=False, **options)
日付のためのフィールドです。
auto_nowは、データを保存(アップデート)するたびに、時間を自動更新するための設定です。
一方auto_now_addは、データが最初に作成された時のみ、時間を保存する設定です。
使い方は以下のようなイメージです。
作成時:created_at=(auto_now_add=True)
更新時:updated_at=(auto_now=True)
デフォルトはauto_now_add=False、auto_now=Falseです。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
is_public = models.BooleanField(verbose_name="公開")
#DateField設定
created_at = models.DateField()
管理画面(auto_now_add=False)
管理画面(auto_now_add=True)
自動で保存されるため、管理画面に表示されません。
◆DateTImeFieldの解説
構文:DateTimeField(auto_now=False, auto_now_add=False, **options)
日付と時間のためのフィールドです。
使い方は、DateFieldと同じです。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
is_public = models.BooleanField(verbose_name="公開")
#DateTimeField設定
created_at = models.DateTimeField()
管理画面(auto_now_add=False)
◆EmailFieldの解説
構文:EmailField(max_length=254, **options)
Emailアドレスのためのフィールドです。
バリデーターがデフォルトで設定されており文字列内に@がなければエラーとなります。
max_lengthはデフォルトで設定されているため設定しなくてもOKです。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
is_public = models.BooleanField(verbose_name="公開")
#EmailField設定
email=models.EmailField()
管理画面
文字列内に@がなければエラー
◆ FileFieldの解説
構文:FileField(upload_to=None, max_length=100, **options)
ファイルをアップロードするためのフィールドです。
ファイルをアップロードする際は、MEDIA_ROOT等の設定が必要になりますので必要に応じて以下をご確認ください。
またupload_toは設定しなくてもOKですが、設定することでアップロードディレクトリをカスタマイズできます。
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
#FileField設定
file = models.FileField()
管理画面
注意点
<form>タグを使ってファイルをアップロードする場合は、<form>タグ内に「enctype="multipart/form-data"」属性を加えること。
◆ ImageFieldの解説
構文:ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
画像をアップロードするためのフィールドです。
使い方は、 FileFieldとほぼ同じためサンプルコード等は割愛します。
1つ注意点としては、画像をアップロードする場合は基本(FileFieldではなく)ImageFieldを使うようにしましょう。
ImageFieldの場合、画像ファイルかどうか自動チェックしてくれるのでセキュリティの観点からImageFieldを使う方がベターです。
◆ SlugFieldの解説
構文:SlugField(max_length=50, **options)
スラッグのためのフィールドです。ほぼCharFieldと同じためサンプルコードは割愛します。
以下のように、入力値が”アルファベット”、”数字”、”アンダーバー”、”ハイフン”以外の場合エラー。
3.3 よく使うフィールドオプション
以降、文字だけではイメージしにくい項目いくつか解説します。
◆verbose_nameの解説
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
#verbose_name設定
is_public = models.BooleanField(verbose_name="公開")
管理画面
◆nullとblankの解説
nullはデータベース、blankは入力フォームに関するオプションです。
"任意"の入力欄を作る際良く使います。
nullとblankを記載する時は、ほとんどのケース同時に使います。
(片方だけTrueにするケースは、見たことないです。)
サンプルコード
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
#null、blank設定
body = models.TextField(null=True, blank=True)
is_public = models.BooleanField(verbose_name="公開")
◆choicesの解説
セレクトボックスを作成できます。
サンプルコード
from django.db import models
#セレクトボックスに表示する項目設定
CATEGORY_CHOICES = [
('Word', 'word'),
('Excel', 'excel'),
('PPT', 'ppt')
]
class Post(models.Model):
title = models.CharField(max_length=255)
#choices設定
category = models.CharField(max_length=30, choices=CATEGORY_CHOICES)
body = models.TextField()
タプル一つ目の'Word'がデータベースのカラム、二つ目の'word'がセレクトボックス表示内容です。
管理画面
◆validatorsの解説
バリデーションをカスタマイズできます。
サンプルコード
from django.db import models
#追加import
from django.core.exceptions import ValidationError
#アドレスにgmail含まない場合エラー
def validate_gmail(value):
if 'gmail' in value:
return value
else:
raise ValidationError("アドレスは有効ではありません。")
class Registration(models.Model):
name = models.CharField(max_length=255)
#バリデーションのカスタマイズ
email = models.EmailField(validators=[validate_gmail])
validatorsは設定可能です。
管理画面
gmailの文字列がないのでエラー。
◆help_textの解説
ヒント文を表示できます。
サンプルコード
from django.db import models
class Registration(models.Model):
name = models.CharField(max_length=255)
#help_text追加
email = models.EmailField(validators=[validate_gmail], help_text="gmailのみ有効")
管理画面
◆primary_keyの解説
通常primary_key(id)は、AutoFieldが設定されており数字が自動で割当られるようになっていますが、カスタマイズすることができます。
サンプルコード
from django.db import models
class Post(models.Model):
#primary_key設定
title = models.CharField(max_length=255, primary_key=True)
body = models.TextField()
管理画面(primary_key=True)
管理画面(primary_key=False(通常))
4. リレーションに対応するフィールド
ここからはモデル間を紐付ける方法について解説します。手法としては、
「OneToOne」、「ForeignKey」、「ManyToMany」の3種類あります。
詳細については以降で解説していきます。
4.1 書き方
class クラス名(models.Model):
アトリビュート名 = models.フィールド(モデルclass, on_delete=※オプション, フィールドオプション)
※OneToOneFieldとForeignKeyのみ必要
記述方法は上記になります。
◆フィールド
「OneToOneField」、「ForeignKey」、「ManyToManyField」から選択します。選択方法は以降のそれぞれの詳細説明で解説していきます。
中でも一番頻出度の高いフィールドは、「ForeignKey」です。
◆ on_deleteオプション(OneToOneFieldとForeignKeyのみ)
以下より選択します。
on_deleteオプションは、OneToOneFieldとForeignKeyのみ必要ですのでご注意ください。
具体的なソースコードは以降で解説します。
4.2 OneToOneField
紐付いているデータの関係性が、一対一の関係です。
例をまとめると以下です。
例
・商品とその在庫情報
・システム利用者とショッピングカート
サンプルコード
from django.db import models
#本のモデル
class Book(models.Model):
title = models.CharField(max_length=255)
#本の在庫モデル
class BookStock(models.Model):
book = models.OneToOneField(Book, on_delete=models.CASCADE)
stock = models.PositiveIntegerField(verbose_name=‘在庫数’, default=0)
4.3 ForeignKey
紐付いているデータの関係性が、多対一の関係です。
上図の通り投稿者から見た投稿記事は複数(多)あるが、投稿記事からみた
投稿者はひとつ(一)だけです。
例をまとめると以下です。
例
・注文明細(多)と注文(一)
・従業員(多)と部署(一)
・ブログ記事(多)と投稿者(一)
サンプルコード
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=255)
#ForeignKeyでUserモデルと紐付け
author = models.ForeignKey(User, on_delete=models.CASCADE)
body = models.TextField()
4.4 ManyToMany
紐付いているデータの関係性が、多対多の関係です。
上図のように共著がある場合に多対多の関係になる場合があります。
サンプルコード
from django.db import models
class Author(models.Model):
name=models.CharField(max_length=255)
class Book(models.Model):
authors = models.ManyToManyField(Author, verbose_name='著者')
5. 関連リンク
今回よく使うフィールドタイプ・オプションのフォーカスしましたが他にも色々種類があります。一度公式ドキュメントを確認してみてください。
6. 最後に
いかがでしたか?
今回はDjangoモデルの中で一番重要な部分にフォーカスして解説していきました。
ただモデルについては、もっと色々な設定が可能です!!
次回は、モデルクラス内で使用するメソッドについて解説していきますのでお楽しみください。
この記事が気に入ったらサポートをしてみませんか?