Django

Djangoのモデルの各フィールドの使い方まとめ「その1」

DjangoのModelのFieldについてここでは、その中でも特によく使う代表的なフィールドについて利用方法の詳細をまとめました。その他のフィールドについても後日まとめたいと思います。

AutoField, BigAutoField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
AutoField 自動的に連番が振られるInterField。PrimaryKeyは指定するように定義する。 Integer NOT NULL primary key AUTOINCREMENT
BigAutoField AutoFieldと同様の自動連番されるIntegerField。
64bitのintegerで1 – 9223372036854775807までの値が振られる。
PrimaryKeyは指定するように定義する。
Integer NOT NULL primary key AUTOINCREMENT

また、primary_key=Trueとして定義しないと“Model %s can’t have more than one AutoField”とエラーが出てしまうので、必ずprimary_key=Trueをつけましょう。

どちらも、多くはidなどのPKに利用されコード上は以下のように定義します。

id = models.AutoField(primary_key=True)
id = models.BigAutoField(primary_key=True)

BooleanField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
BooleanField 真偽値のフィールド。
チェックボックスなどに利用される。
bool NOT NULL

NOT NULLなのでdefaultを設定する必要があります(もしくは、null=Trueとするか)

defaultを設定をしないと、“You are trying to change the nullable field “と聞かれ、defaultの値を設定するかオプションを選ばされます。

is_deleted, activeなどフラグ系に使われます。

以下のように定義します。

active = models.BooleanField(default=True)
# 値がない場合はTrueが格納される

active = models.BooleanField(null=True)
# 値がない場合NULLが格納される

CharField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
CharField 文字列のフィールド。大きい文字列はTextFieldに入れる。max_lengthを設定しなければいけない。 varchar(max_length)

max_lengthを設定をしない場合、“CharFields must define a ‘max_length’ attribute.”とエラーが表示されます。

一般的な文字列のカラムに利用されます。

以下のように定義します。

title = models.CharField(max_length=256)
# max_lengthを定義する

TextField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
TextField 大きな文字列の格納に利用されるフィールド。TextAreaで利用される。max_lengthを指定する必要はない text

以下のように定義します。

content = models.TextField()

DateField, DateTimeField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
DateField Datetime.dateを保存する。以下のパラメータを設定できる。
FormのデフォルトのウィジェットはTextInputです。
adminページにはjavascriptのカレンダーと現在日付を自動で入れるボタンが表示される。
date not null
DateTimeField 日時を保存するフィールドです。pythonのdatetime.datetimeであらわされます。
FormのデフォルトのウィジェットはTextInput。adminページには2つのTextInputのウィジェットがある。
datetime not null

引数には以下のパラメータが利用されます

autonow: オブジェクトが保存される(update)度に自動的に現在時刻に更新されます。このフィールドを設定した場合にはModel.save()実行時には自動更新されますが、Queryset.update()などで他のフィールドを更新した場合には自動更新されません。

auto_now_add: オブジェクトが挿入される(insert)度に、自動的に現在時刻で更新されます。

defaultの値は、

DateField: datetime.date.today()
DateTimeField: django.utils.timezone.now()

以下のように定義します。

update_date = models.DateField(auto_now=True)
inserted_date = models.DateField(auto_now=True)

updated_at = models.DateTimeField(auto_now=True)
inserted_at = models.DateTimeField(auto_now_add=True)します。

EmailField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
EmailField 保存する値がEmailアドレスで利用できる形式かどうかチェックする機能(EmailValidator)を持ったCharField varchar

作成にはmax_lengthを設定しなければなりません。

以下のように定義します。

email = models.EmailField(max_length=240)

IntegerField
フィールド名 概要 DBでのデフォルトのカラム定義(sqlite)
IntegerField -2147483648 to 2147483647の値の整数のフィールド。
Form上のウィジェットはlocalizeをFalseにしている場合にはNumberInput,それ以外はTextInput
Integer NOT NULL

以下のように定義します。

age = models.IntegerField(default=0)