Djangoでよく使うデータベース設計の定義型まとめ(models.py)
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()
ディスカッション
コメント一覧
まだ、コメントがありません