見出し画像

【図解あり】Djangoモデル よく使うフィールド一覧

モデルの扱い方がよくわからない…
解説・サンプルコードを見ても何してるかよくわからない…

djangoモデルを扱う上でこれらのような課題に直面したことあるかと思います。結局馴染みがなければ、コードを見ても字面だけで理解するのは難しいかと思います。

したがって今回djangoのモデルについて分かりにくい部分を図を使って解説しています。

「イマイチモデルについてよくわからない」といった方にオススメの内容になっているかと思います。

1. 今回の解説内容

今回は、モデルで一番躓きやすいと思われるフィールドタイプフィールドオプションについて解説していきます。

フィールドタイプやオプションの用語については、以下のように定義して進めていきます。

無題のプレゼンテーション

またフィールドタイプやオプションについてはかなりの数があり全てを紹介するのは難しいためよく使うものにフォーカスして解説していきます。

2. モデルの役割と特徴

本題に入る前に、djangoのモデル役割や特徴について簡単に解説します。

すでに基礎をある程度理解されている方は、この章を読み飛ばしていただいても結構です。

◆モデルの役割

無題のプレゼンテーション (2)

上図の通り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 よく使うフィールドタイプ

無題の図形描画 (7)

◆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="公開")

管理画面

スクリーンショット 2021-03-14 15.03.02

◆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="公開")

管理画面

スクリーンショット 2021-03-14 15.03.02

◆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="公開")

管理画面

スクリーンショット 2021-03-14 15.03.02

◆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)

スクリーンショット 2021-03-14 15.31.39

管理画面(auto_now_add=True)

スクリーンショット 2021-03-14 15.03.02

自動で保存されるため、管理画面に表示されません。

◆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)

スクリーンショット 2021-03-14 15.55.05

◆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()

管理画面

スクリーンショット 2021-03-14 16.04.54

文字列内に@がなければエラー

◆ 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()

管理画面

スクリーンショット 2021-03-14 22.13.53

注意点

<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と同じためサンプルコードは割愛します。

以下のように、入力値が”アルファベット””数字””アンダーバー””ハイフン”以外の場合エラー。

スクリーンショット 2021-03-14 22.42.09

3.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="公開")

管理画面

スクリーンショット 2021-03-14 15.03.02

◆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'がセレクトボックス表示内容です。

管理画面

スクリーンショット 2021-03-16 21.11.52

◆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は設定可能です。

管理画面

スクリーンショット 2021-03-18 11.51.17

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のみ有効")

管理画面

スクリーンショット 2021-03-18 11.49.32

◆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)

スクリーンショット 2021-03-16 22.13.06

管理画面(primary_key=False(通常))

スクリーンショット 2021-03-16 22.07.57

4. リレーションに対応するフィールド

ここからはモデル間を紐付ける方法について解説します。手法としては、
「OneToOne」「ForeignKey」「ManyToMany」の3種類あります。
詳細については以降で解説していきます。

4.1 書き方

class クラス名(models.Model):
    アトリビュート名 = models.フィールド(モデルclass, on_delete=※オプション, フィールドオプション)
    ※OneToOneFieldとForeignKeyのみ必要

記述方法は上記になります。

◆フィールド
「OneToOneField」「ForeignKey」「ManyToManyField」から選択します。選択方法は以降のそれぞれの詳細説明で解説していきます。

中でも一番頻出度の高いフィールドは、「ForeignKey」です。

◆ on_deleteオプション(OneToOneFieldとForeignKeyのみ)
以下より選択します。

無題の図形描画 (4)

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

紐付いているデータの関係性が、多対一の関係です。

無題の図形描画 (5)

上図の通り投稿者から見た投稿記事は複数(多)あるが、投稿記事からみた
投稿者はひとつ(一)
だけです。

例をまとめると以下です。


・注文明細(多)と注文(一)
・従業員(多)と部署(一)
・ブログ記事(多)と投稿者(一)

サンプルコード

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

紐付いているデータの関係性が、多対多の関係です。

無題の図形描画 (6)

上図のように共著がある場合に多対多の関係になる場合があります。

サンプルコード

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モデルの中で一番重要な部分にフォーカスして解説していきました。

ただモデルについては、もっと色々な設定が可能です!!

次回は、モデルクラス内で使用するメソッドについて解説していきますのでお楽しみください。

この記事が気に入ったらサポートをしてみませんか?