Djangoでよく使うデータベース設計の定義型まとめ(models.py)

2021年3月26日Djangoの豆知識

Djangoのmodels.pyでよく使う型を具体的な使用例とともにまとめてみました。

(2021/09/20に更新:UUIDFieldを追加)

文字列系

CharField

短めの文字列を入れる。(例:記事のタイトル)

title = models.CharField(max_length=50)

** CharFieldはmax_lengthという引数で、最大文字数を決める必要があります。今回の例では50文字までと定義しています。最大文字数はデータベースによって異なりますが、255文字を超えたら次に出てくるTextFieldを使いましょう。

TextField

長めの文字列を入れる。(例:記事の本文)

content = models.TextField()

CharFieldで必要だった引数max_lengthは必要ありません。

EmailField

メールアドレスを入れる。(例:sample@〇〇.com)

email = models.EmailField()

TextFieldのメールアドレスしか入らないバージョンです。

UUIDField

Djangoではデフォルトでid=1,2,3,…というカラムがあります。

これを使わずUUIDを主キーにしたいときUUIDFieldを使います。

uuid.uuid4()ではなく、uuid.uuid4となっているところに注意が必要です。

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

TextFieldのメールアドレスしか入らないバージョンです。

数値系

PositiveIntergerField

時間系

DateTimeField

年月日時分秒を入れる。(例:2021-03-26 14:42:50)

DateField

年月日を入れる。(例:2021-03-26)

TimeField

時分秒を入れる。(例:14:42:50)

時間系で覚えておくべき便利な使い方

ブログの記事があり、「作成日時」「更新日時」の項目が必要な時、以下のように引数を設定すると自動で処理してくれるので便利です。

class Blog(models.Model):
	title = models.CharField(max_lenth=50)
	
	created_at = models.DateTimeField(auto_now_add=True)#作成日時
	updated_at = models.DateTimeField(auto_now=True)#更新日時

** auto_now_add=Trueを使うと、そのインスタンス(記事の一つ一つ)が作成されたときを自動で記録→「作成日時」に相当します。

** auto_now=Trueを使うと、そのインスタンス(記事の一つ一つ)に変更があったときを自動で毎回記録→「更新日時」に相当します。

** autho_now_add、auto_nowをTrueにすると管理画面からその項目が消えます。

ファイル系

FileField

ファイルを入れる。(例:PDFファイルなど)

pdf = models.FileField(upload_to="pdf/")

** 引数にupload_toが必要で、これはどこにアップロードされたファイルを置くかを定義しています。

ImageField

画像を入れる。(例:JPEGファイルなど)

icon = models.ImageField(upload_to="user/icon/")

これはFileFieldの画像に特化したバージョンと言えるでしょう。

** 引数にupload_toが必要で、これはどこにアップロードされたファイルを置くかを定義しています。

リレーション系

ForeignKey

一対多対応の関係が作成できます。(例:記事やコメントの、作者)

ほかのテーブルとの関係を作る時(1)、同じテーブルとの再帰的な関係を作る時(2)の2パターンの使い方があります。

(1)ほかのテーブルとの関係を作る時

#Userをほかのテーブルとする
author = models.ForeignKey(User,on_delete=models.PROTECT) #記事の作者を入れる時に使える

(2)同じテーブルとの再帰的な関係を作る時


next_blog = models.ForeignKey("self",on_delete=models.PROTECT) #次のおすすめ記事を入れる時に使える

** on_deleteは必須の引数で、

on_delete=models.CASCADEとすると、その関連するUserが削除されたときにBlogも連鎖的に自動で削除される

on_delete=models.PROTECTとするとUserが削除されても、Blogは削除されない。

ManyToManyField

多対多対応の関係が作成できます。(例:いいね機能やフォロー機能)

liked_by = models.ManyToManyField(User,related_name="liked_blog")

これは少し難しいのでこちらで解説します。(工事中…)

OneToOneField

一対一対応の関係が作成できます。(例:ユーザーに電話番号や住所など追加の情報を足したい時)

論理値(True or False)

BooleanField

TrueかFalseを入れる。これは文字列ではなくPythonの型として入ります。

checked = models.BooleanField()