🚀

[Django] modelsのField一覧

に公開

はじめに

社内の有志メンバーの活動で Django を利用するので、models について理解する必要があったので、
下記の公式ドキュメントを読み、本記事にまとめます。

Field(フィールド)一覧

Field の種類 フィールドの説明 備考
BooleanField boolean 値 (True/False)
CharField 文字列
TextField 長い文字列(テキスト) max_lengthが必須
SlugField 文字列(アルファベット、数字、アンダーバー、ハイフンのみ)
JSONField JSON エンコードされたデータ
IntegerField 整数
FloatField 浮動小数点数
PositiveIntegerField 0 または正の整数
DateTimeField 日付と時刻
DateField 日付
TimeField 時刻
EmailField メールアドレス
URLField URL
FileField ファイル
ImageField 画像ファイル
GenericIPAddressField IP アドレス

Field 詳細

BooleanField

# 初期値をNoneにする場合
hoge = models.BooleanField()
# 初期値をTrueにする場合
hoge = models.BooleanField(default=True)
# 初期値をFalseにしたい場合
hoge = models.BooleanField(default=False)

CharField

# 最大文字数にしたい場合(最大文字数:255)
hoge = models.CharField(max_length=255)

TextField

hoge = models.TextField()

SlugField

# max_length が指定されていないとき、最大文字数は50になる
hoge = models.SlugField()

JSONField

JSONFieldは、MariaDB, MySQL, Oracle, PostgreSQL, SQLite のみにサポートされている
※SQLite は、JSON1 extension が有効状態のみ

# SON エンコードされた文字列を出力される
hoge = models.JSONField()

IntegerField

-2147483648から2147483647までの値は、Django でサポートされているすべてのデータベースで安全です。

from django.core.validators import MaxValueValidator, MinValueValidator
# 最大数を1000/最小数を1にする場合
hoge = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(1000)])

FloatField

localizeFalseのときNumberInputで、そうでなければTextInputとなります。

from django.core.validators import MaxValueValidator, MinValueValidator
# 最大数を0.999/最小数を0.001にする場合
hoge = models.FloatField(validators=[MinValueValidator(0.00), MaxValueValidator(0.999)])

PositiveIntegerField

0から2147483647までの値は、Django でサポートされているすべてのデータベースで安全です。

from django.core.validators import MaxValueValidator, MinValueValidator
# 最大数を2147483647/最小数を1にする場合
hoge = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(2147483647)])

DateTimeField

# 対象のオブジェクトが最初に作成されたときに自動的に現在の日付/時間が保存する
created_at = models.DateTimeField(auto_now_add=True)
# 対象のオブジェクトが変更される度に自動的に現在の日付/時間が保存する
updated_at = models.DateTimeField(auto_now=True)

※オプションauto_nowauto_now_addはデフォルトが False です。


DateField

# 対象のオブジェクトが最初に作成されたときに自動的に現在の日付が保存する
created_at = models.DateField(auto_now_add=True)
# 対象のオブジェクトが変更される度に自動的に現在の日付が保存する
updated_at = models.DateField(auto_now=True)

※オプションauto_nowauto_now_addはデフォルトが False です。


TimeField

# 対象のオブジェクトが最初に作成されたときに自動的に現在の時間が保存する
created_at = models.TimeField(auto_now_add=True)
# 対象のオブジェクトが変更される度に自動的に現在の時間が保存する
updated_at = models.TimeField(auto_now=True)

※オプションauto_nowauto_now_addはデフォルトが False です。


EmailField

hoge = models.EmailField()

URLField

hoge = models.URLField()

※最大文字数はデフォルトで 200 文字


FileField

# upload_to: MEDIA_ROOT配下の指定したファイルパスに保存される
# FileExtensionValidator: 登録できる拡張子を指定できる
hoge = models.FileField(upload_to='uploads/%Y/%m/%d/', validators=[FileExtensionValidator(['pdf'])])

ImageField

# upload_to: MEDIA_ROOT配下の指定したファイルパスに保存される
# FileExtensionValidator: 登録できる拡張子を指定できる
hoge = models.ImageField(upload_to='uploads/%Y/%m/%d/', validators=[FileExtensionValidator(['png'])])

GenericIPAddressField

hoge = models.GenericIPAddressField()

Pv4 か IPv6 のアドレスで、文字列フォーマットです (例: 192.0.2.30 ないし 2a02:42fe::4)。このフィールドのデフォルトのフォームウィジェットは TextInput です。

IPv6 アドレスは、 RFC 4291#section-2.2 section 2.2 (同セクションの paragraph 3 で提案された IPv4 のフォーマットの使用を含む) にしたがって、 ::ffff:192.0.2.0 のように正規化します。たとえば、 2001:0::0:01 は 2001::1 と正規化され、 ::ffff:0a0a:0a0a は ::ffff:10.10.10.10 と正規化されます。そして、すべての文字は小文字に変換されます。

Field options(フィールドオプション)一覧

Field options の種類 フィールドの説明
null null の許容
blank blank の許容
choices 任意の選択肢
default デフォルト値の設定
primary_key プライマリーキーの設定
unique 一意制約の設定
verbose_name 管理画面でのモデルの名前を指定
validators バリデータの設定

null

# DBにnullを保存できるようにする
hoge = models.BooleanField(null=True)
# DBにnullを保存出来ないようにする
hoge = models.BooleanField(null=False)

blank

# DBへの入力を必須にする
hoge = models.BooleanField(blank=True)
# DBに空でもOkにする
hoge = models.BooleanField(blank=False)

choices

# TシャツのサイズをSMLのいずれかにする
SHIRT_SIZES = [
    ("S", "Small"),
    ("M", "Medium"),
    ("L", "Large"),
]
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

default

# データの指定がない場合TrueがDBに保存される
hoge = models.BooleanField(default=True)

primary_key

primary_key=Trueが設定されなかった場合、Django は自動的に主キーを保存するためにIntegerFieldを追加

# idではなく、nameを主キーにしたい場合
name = models.CharField(max_length=100, primary_key=True)

unique

社員番号など重複が許されていないデータ

hoge = models.PositiveIntegerField(unique=True)

verbose_name

管理画面でtitleではなく、タイトルと表示してくれる

title = models.CharField(max_length=, verbose_name='タイトル')

validators

from django.core.validators import MaxValueValidator, MinValueValidator
# 最大数を1000/最小数を1にする場合
hoge = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(1000)])

おわりに

今回公式ドキュメントを読み、「こんな事まで出来るのか!」と色々学びになりました。
やぱり、公式ドキュメントを読んで理解できるエンジニアは強いなと感じました。

GitHubで編集を提案

Discussion